[프로그래머스 위클리 챌린지]#86048 7주차

문제

사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.

오늘 회의실에는 총 n명이 입실 후 퇴실했습니다. 편의상 사람들은 1부터 n까지 번호가 하나씩 붙어있으며, 두 번 이상 회의실에 들어온 사람은 없습니다. 이때, 각 사람별로 반드시 만난 사람은 몇 명인지 구하려 합니다.

예를 들어 입실 명부에 기재된 순서가 [1, 3, 2], 퇴실 명부에 기재된 순서가 [1, 2, 3]인 경우,

  • 1번과 2번은 만났는지 알 수 없습니다.
  • 1번과 3번은 만났는지 알 수 없습니다.
  • 2번과 3번은 반드시 만났습니다.

또 다른 예로 입실 순서가 [1, 4, 2, 3], 퇴실 순서가 [2, 1, 3, 4]인 경우,

  • 1번과 2번은 반드시 만났습니다.
  • 1번과 3번은 만났는지 알 수 없습니다.
  • 1번과 4번은 반드시 만났습니다.
  • 2번과 3번은 만났는지 알 수 없습니다.
  • 2번과 4번은 반드시 만났습니다.
  • 3번과 4번은 반드시 만났습니다.

회의실에 입실한 순서가 담긴 정수 배열 enter, 퇴실한 순서가 담긴 정수 배열 leave가 매개변수로 주어질 때, 각 사람별로 반드시 만난 사람은 몇 명인지 번호 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

입출력 예제

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]

풀이

이 문제는 해쉬 셋을 이용해서 풀 수 있었다.

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;
    }
}

좋은 웹페이지 즐겨찾기