[프로그래머스] 위클리 챌린지 7주차
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] > 0) break;
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번을 제거해주고 끝나게된다.