-
[프로그래머스] 위클리 챌린지 7주차ALGORITHM/PROGRAMMERS 2021. 9. 20. 22:08
https://programmers.co.kr/learn/courses/30/lessons/86048
2021-09-20
12345678910111213141516171819202122232425import 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번을 제거해주고 끝나게된다.
'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 12주차 - 피로도 (0) 2021.10.27 [프로그래머스 ] 위클리 챌린지 3주차 - 퍼즐 조각 채우기 (0) 2021.09.26 [프로그래머스] 약수의 개수와 덧셈 (월간 코드 챌린지 시즌2) (0) 2021.09.14 [프로그래머스] 음양 더하기 (월간 코드 챌린지 시즌2) (0) 2021.09.13 [프로그래머스] 없는 숫자 더하기 (월간 코드 챌린지 시즌3) (0) 2021.09.13