[프로그래머스] (LV2) 입실 퇴실
Python3
문제 설명
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.
오늘 회의실에는 총 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]
입출력 예 설명
입출력 예 #1
만약, 다음과 같이 회의실에 입실, 퇴실했다면
회의실 설명 [1] 1번 입실 [1, 3] 3번 입실 [3] 1번 퇴실 [2, 3] 2번 입실 [3] 2번 퇴실 [] 3번 퇴실
- 1번과 2번은 만나지 않습니다.
- 1번과 3번은 만납니다
- 2번과 3번은 만납니다.
만약, 다음과 같이 회의실에 입실, 퇴실했다면
회의실 설명 [1] 1번 입실 [] 1번 퇴실 [3] 3번 입실 [2, 3] 2번 입실 [3] 2번 퇴실 [] 3번 퇴실
- 1번과 2번은 만나지 않습니다.
- 1번과 3번은 만나지 않습니다.
- 2번과 3번은 만납니다.
위 방법 외에 다른 순서로 입실, 퇴실 할 경우 1번과 2번이 만나도록 할 수도 있습니다. 하지만 2번과 3번이 만나지 않도록 하는 방법은 없습니다.
따라서
- 1번과 2번은 만났는지 알 수 없습니다.
- 1번과 3번은 만났는지 알 수 없습니다.
- 2번과 3번은 반드시 만났습니다.
입출력 예 #2
문제의 예시와 같습니다.
입출력 예 #3
- 1번과 2번은 만났는지 알 수 없습니다.
- 1번과 3번은 반드시 만났습니다.
- 2번과 3번은 반드시 만났습니다.
입출력 예 #4
- 1번과 2번은 반드시 만났습니다.
- 1번과 3번은 반드시 만났습니다.
- 2번과 3번은 반드시 만났습니다.
입출력 예 #5
- 1번과 2번은 반드시 만났습니다.
- 1번과 3번은 만났는지 알 수 없습니다.
- 1번과 4번은 반드시 만났습니다.
- 2번과 3번은 만났는지 알 수 없습니다.
- 2번과 4번은 반드시 만났습니다.
- 3번과 4번은 만났는지 알 수 없습니다.
풀이
Python
1 | def solution(enter, leave): |
설명
- 상황 속 조건이 있는 문제는 숨겨진 규칙을 찾으려 하는것보다 시물레이션 풀이를 이용해야 한다.
- 규칙을 찾으려 한다면 이를 검증하는 작업도 필요해 오히려 복잡할 수 있기 때문이다.
- 해당 문제도 입장과 퇴장의 상황을 실시간으로 시뮬레이션 하는 코드를 작성했다.
- 현재 순서에 퇴장 인원이 있으면 퇴실을, 없으면 입실을 진행한다.
- 이 과정에서 함께
stack
에 담겨있던 사람들간의 접촉 횟수를 카운팅하여 풀이한다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
[프로그래머스] (LV2) 입실 퇴실