https://programmers.co.kr/learn/courses/30/lessons/86048
한 방의 출입했던 사람들에 대하여 입실 순서와 퇴실 순서가 주어질 때 반드시 만날 수 밖에 없는 사람을 구하는 문제이다.
퇴실은 입실하기 전에는 일어날 수 없는 행동이다.
이에 따라 퇴실 순서와 입실 순서에 각각 인덱스를 두는 투포인터 기법을 사용했다.
- 퇴실 순서에 해당하는 사람이 입장하기 전까지 입실 순서에 따라 입장시킨다.
- 1 을 모든 사람이 퇴실할 때까지 반복한다.
입실한 상태, 즉 방에 누가 있는가를 표현하기 위해 Set
을 사용했다.
( i번 사람이 방에 있다면 Set 안에 i라는 값이 들어있다. )
특정 인덱스, 예를 들어 1번 사람이 입실했을 때 방에 있던 사람 을 Set을 통해 구한 뒤 answer
배열의 1번 인덱스에 저장한다.
모든 사람이 퇴실한 이후에 answer
배열에는 각 사람이 입실했을 때 방에 있던 사람의 인덱스가 저장되어있다.
하지만 방에 먼저 들어와 있던 사람의 경우 나중에 들어온 사람에 대한 인덱스가 저장되어 있지 않으므로 answer 배열을 순회하며 answer 배열의 인덱스에 해당하는 사람을 만났다는 정보를 추가해준다.
이를 구현한 코드는 다음과 같다.
function solution(enter, leave) {
var answer = [];
let enterIdx = 0, leaveIdx = 0;
const ROOM = new Set();
while(leaveIdx < leave.length) {
if (ROOM.has(leave[leaveIdx])) {
ROOM.delete(leave[leaveIdx++]);
}
else {
answer[enter[enterIdx]] = [...ROOM.values()];
ROOM.add(enter[enterIdx++]);
}
}
answer.forEach((a, idx) => {
a.forEach((elem) => {
answer[elem].push(idx);
})
});
return answer.map(val => [...new Set(val)].length).slice(1);
}
문제에서 사람의 번호는 1번부터 시작된다고 주어졌으므로 0번 인덱스를 제외한 배열을 반환한다.
'단단해지기 > Algorithm' 카테고리의 다른 글
[프로그래머스] 복서 정렬하기 Javascript (0) | 2021.09.18 |
---|---|
[프로그래머스] 모음사전 Javascript (0) | 2021.09.18 |
[백준/BOJ 알고리즘] 17845 수강 과목 C++ (0) | 2021.09.12 |
[백준/BOJ 알고리즘] 10830 행렬 제곱 C++ (0) | 2021.09.12 |
[백준/BOJ 알고리즘] 16236 아기상어 C++ (0) | 2020.09.17 |