https://programmers.co.kr/learn/courses/30/lessons/86048?language=javascript
문제 설명
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.
오늘 회의실에는 총 n명이 입실 후 퇴실했습니다. 편의상 사람들은 1부터 n까지 번호가 하나씩 붙어있으며, 두 번 이상 회의실에 들어온 사람은 없습니다. 이때, 각 사람별로 반드시 만난 사람은 몇 명인지 구하려 합니다.
예를 들어 입실 명부에 기재된 순서가 [1, 3, 2], 퇴실 명부에 기재된 순서가 [1, 2, 3]인 경우,
1번과 2번은 만났는지 알 수 없습니다.
1번과 3번은 만났는지 알 수 없습니다.
2번과 3번은 반드시 만났습니다.
또 다른 예로 입실 순서가 [1, 4, 2, 3], 퇴실 순서가 [2, 1, 3, 4]인 경우,
1번과 2번은 반드시 만났습니다.
1번과 3번은 만났는지 알 수 없습니다.
1번과 4번은 반드시 만났습니다.
2번과 3번은 만났는지 알 수 없습니다.
2번과 4번은 반드시 만났습니다.
3번과 4번은 반드시 만났습니다.
회의실에 입실한 순서가 담긴 정수 배열 enter, 퇴실한 순서가 담긴 정수 배열 leave가 매개변수로 주어질 때, 각 사람별로 반드시 만난 사람은 몇 명인지 번호 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ enter의 길이 ≤ 1,000
1 ≤ enter의 원소 ≤ enter의 길이
모든 사람의 번호가 중복없이 하나씩 들어있습니다.
leave의 길이 = enter의 길이
1 ≤ leave의 원소 ≤ leave의 길이
모든 사람의 번호가 중복없이 하나씩 들어있습니다.
입출력 예
enter | leave | result |
---|---|---|
[1,3,2] | [1,2,3] | [0,1,1] |
[1,4,2,3] | [2,1,3,4] | [2,2,1,3] |
[3,2,1] | [2,1,3] | [1,1,2] |
[3,2,1] | [1,3,2] | [2,2,2] |
[1,4,2,3] | [2,1,4,3] | [2,2,0,2] |
문제 풀이
function solution(enter, leave) {
var answer = new Array(enter.length+1).fill(0);
let room = [];
while(leave.length > 0) {
let comein = enter.shift();
if(comein) room.push(comein);
if(room.length > 1) {
room.forEach(el => {
if(el === comein) answer[el] += room.length-1
else answer[el]+=1
})
}
let len = room.length
for (let i = 0; i<len; i++) {
let out = room.indexOf(leave[0])
if(out !== -1) {
leave.shift();
room.splice(out,1)
}
else{
break;
}
}
}
answer.shift();
return answer;
}
먼저 정답을 배열로 만들어준다.(0번째 인덱스는 더미)
방 배열을 만든 뒤
leave 배열의 길이가 0이 될때까지 반복문을 돌린다.
반복문의 내용은 처음에 사람이 들어오게되고 방에 사람이 2명이상이면 들어온사람은 방의 사람수 -1(본인을뺀)을 정답에 넣어주고 나머지 방 안에 있는 사람은 +1을 해준다.
그리고 방안의 사람 수만큼 반복문을 돌리는데
leave의 0번째 인덱스의 사람이 방에 없다면 반복문을 멈추고 있다면 반복문을 통해 방에서도 사람을 내보내고 leave의 길이역시 줄어들게 된다.
그 뒤 마지막으로 더미를 없애준뒤 리턴하면 답이 나온다.