[プログラマーSweetチャレンジ]#86048 7週目



質問する


社会的な距離を保つために、会議室に出入りするときは名簿に名前を書きます.入室とチェックアウトを同時に行う場合はなく、入室時間とチェックアウト時間は別に記録されません.
今日の会議室は全部でn人が入室してチェックアウトしました.便利な人は1からnまでそれぞれ番号があり、2回以上会議室に入ったことがない.この時、誰もが見たことがある人がどれだけいるかを明らかにしたいと思っています.
例えば、「入室名簿」の順序は[1,3,2]、「退室名簿」の順序は[1,2,3]である.
  • 1号と2号を見たことがあるかどうか分かりません.
  • 1号と3号を見たことがあるかどうか分かりません.
  • 2番と3番は必ず会いました.
  • もう1つの例は、入室順が[1,4,2,3]、チェックアウト順が[2,1,3,4]の場合、
  • 1号と2号は必ず会いました.
  • 1号と3号を見たことがあるかどうか分かりません.
  • 1号と4号は必ず会いました.
  • 号と3号を見たことがあるかどうか分かりません.
  • 2番と4番は必ず会いました.
  • 3号と4号は必ず会いました.
  • 会議室で、入室順の整数配列enterと退室順の整数配列休暇をパラメータとする場合は、解法関数を完了し、一人一人が遭遇しなければならない人を番号順に配列に入れて返してください.

    I/O例


    enterleaveresult[1,3,2][1,2,3][0,1,1][1,4,2,3][2,1,3,4][2,2,1,3][3,2,1][2,1,3][1,1,2][3,2,1][1,3,2][2,2,2][1,4,2,3][2,1,4,3][2,2,0,2]

    に答える


    この問題は3つのハッシュ表で解くことができる.
    import java.util.HashSet;
    
    class Solution {
        public int[] solution(int[] enter, int[] leave) {
            int[] answer = new int[enter.length];
            HashSet<Integer> room = new HashSet<>();    //회의실 현황
            int idx = 0;
            
            for(int i=0; i<enter.length; i++) {         //순서대로 입장
                int l;
                
                while(idx<leave.length && room.contains(l = leave[idx])) {    //회의실에 있고 퇴실가능한사람 내보내기
                    idx++;
                    room.remove(l);
                }
                
                int e =  enter[i];
                
                for(int x : room) {       //입실하면서 마주친사람 체크
                    answer[e-1]++;
                    answer[x-1]++;
                }
                
                room.add(e);
            }
            
            return answer;
        }
    }