ALGORITHM/PROGRAMMERS

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

0298 2021. 9. 20. 22:08

https://programmers.co.kr/learn/courses/30/lessons/86048

 

코딩테스트 연습 - 7주차

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

programmers.co.kr

2021-09-20


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;
class Solution {
    public int[] solution(int[] enter, int[] leave) {
       int[] answer = new int[enter.length];
        int idx = 0;
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 0; i < leave.length; i++) {
            for(int j = idx; j < enter.length; j++) {
                if(answer[leave[i]-1> 0break;
                list.add(enter[j]);
                idx++;
                if(enter[j] == leave[i]) {
                    break;
                }
            }
            list.remove(Integer.valueOf(leave[i]));
            for(int j = 0; j < list.size(); j++) {
                answer[list.get(j) - 1]++;
            }
            answer[leave[i] - 1+= list.size();
        }
 
        return answer;
    }
}
cs

#문제풀이

생각보다 시간이 좀 많이 걸렸던 문제이다. 

어떤 사람이 입실할 때 회의실에 있던 사람들 부터 어떤 사람이 퇴실하기 전까지 회의실에 남아있던 사람들을 카운팅 해주면 된다. 

 

기준은 퇴실을 기준으로 잡았고,

예제 2번에서 입실 명부는 [1, 4, 2, 3]이고 퇴실 명부는 [2, 1, 3, 4]이다.

 

1) 퇴실을 해야할 차례가 2번 일 때, 

2번이 퇴실하기 전까지 남아있었고, 2번이 입실한 시점에 있던 사람들 체크가 필요하다.

enter 배열을 돌면서 2번이 입실한 시점까지 들어온 사람들을 체크하면 {1, 4}가 있다. 

그리고, 반대로 생각하면 {1, 4}도 2번을 만났다.

그래서 라인 18번 기준으로 {1, 4} 사람들도 2번을 만났으므로 +1 씩(answer 배열) 해주고,  라인 20번 기준으로 2는 리스트의 길이(1, 4) 만큼 더해준다.

1 -> {2}

2 -> {1, 4}

4 -> {2}

 

2) 퇴실을 해야할 차례가 1번 일 때, 

라인 9번을 기준으로 보면 이미 answer 배열에 값이 있다는 소리는, 이미 리스트에 들어와 있는 원소라는 얘기와 같다. 

그래서, enter 배열을 따로 돌지 않고, list에 들어있는 {1} 원소만 빼주었다. 그리고 마찬가지로 라인 18번 기준으로 보면 

{4} 는 1을 만난 것이므로 +1을 해주었고, 라인 20번 기준으로 1은 리스트의 길이 (4)만큼 더해줬다.

1-> {2, 4}

2-> {1, 4}

4->{1, 2}

 

3) 퇴실을 해야할 차례가 3번일 때,

마지막으로 체크했던 idx 다음부터 enter배열을 돌게 된다. 마찬가지로 라인 18번 기준으로 보면 리스트에 남아있는 {4}는 3을 만난 것이므로 +1을 해주었고, 라인 20번 기준으로 3은 리스트의 길이(4)만큼 더해줬다.

1-> {2, 4}

2 ->{1, 4}

3->{4}

4->{1, 2, 3}

 

4) 퇴실을 해야할 차례가 4번일 때, 

마지막으로 리스트에서 4번을 제거해주고 끝나게된다.