본문 바로가기

CS/알고리즘

[프로그래머스] 위클리 챌린지 7주차 - 입실 퇴실

728x90

 

문제

문제 보기

 

풀이

#Set #HashSet

회의실(room)은 사람들이 모이는 공간이지만 순서와 상관없이 출입이 가능합니다.

이런 특징은 Set을 회의실로 구현이 가능합니다.

 

#Queue #LinkedList 

입실 명부(inList), 퇴실 명부(outList)

명부에 적힌 순서에 따라 인원들이 입, 퇴실해야 합니다.

순서가 중요하기 때문에, 각 명부를 Queue로 구현합니다.

 

문제에서 주어진 상황인 반드시 만난 사람을 구하는 상황은 회의실에 입실한 사람이 퇴실할 수 있을 때 무조건 퇴실하는 상황입니다.

퇴실 queue의 front 인원이 회의실에 있다면 room에서 나가도록 하고, 입실 queue의 front 인원을 회의실에 입실시키도록 합니다.

 

#Map #HashMap 

각 사람별로 반드시 만난 사람은 몇 명인지 저장합니다.

회의실에 입실한 사람은 회의실에 이미 입실한 사람 수만큼 만났습니다.

회의실에 이미 입실한 사람은 새로운 사람이 입실하면 만난 사람 수를 1명 추가합니다.

Map의 key를 사람 번호, value를 만난 사람 수로 저장했습니다.

 

소스코드

github

 

import java.util.*;

class Solution {
    public int[] solution(int[] enter, int[] leave) {
        int N = enter.length;
        Set<Integer> room = new HashSet<>();
        Map<Integer, Integer> meetCnt = new HashMap<>();
        Queue<Integer> inList = new LinkedList<Integer>();
        Queue<Integer> outList = new LinkedList<Integer>();
        for(int i = 0; i < N; i++) {
            inList.add(enter[i]);
            outList.add(leave[i]);
            meetCnt.put(i+1, 0);
        }

        while(!inList.isEmpty()) {
            int in = inList.poll();
            // 이미 입실한 친구들은 새롭게 온 친구 1명을 만났다.
            if(room.size() >= 1) {
                room.forEach(humanNum -> {
                    meetCnt.put(humanNum,  meetCnt.get(humanNum) + 1);
                });
            }
            meetCnt.put(in, room.size());   // 새로 입실한 친구는 방에 있는 사람 수 만큼 만났다.
            room.add(in);
            //System.out.println(room.toString() + " || " + in + "번 in");

            while(!outList.isEmpty() && room.contains(outList.peek())) {
                int out = outList.poll();
                room.remove(out);
                //System.out.println(room.toString() + " || " + out + "번 out");
            }
        }

        int[] answer = new int[N];
        for(int i = 0 ; i < N ; i++) {
            answer[i] = meetCnt.get(i+1);
        }
        return answer;
    }
}