알고리즘 문제 풀이 - 입실 퇴실

공부중인 개발자·2021년 9월 28일
0

알고리즘

목록 보기
39/63
post-thumbnail

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의 길이
모든 사람의 번호가 중복없이 하나씩 들어있습니다.

입출력 예

enterleaveresult
[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의 길이역시 줄어들게 된다.
그 뒤 마지막으로 더미를 없애준뒤 리턴하면 답이 나온다.

profile
열심히 공부하자

0개의 댓글