문제에서 입실과 퇴실이 동시에 이뤄지는 경우가 없다는 사실을 이용하자. 핵심은 현재 회의실에 있는 사람들을 leave의 순서에 맞게 퇴실 시킬 수 있다면, 그 순서만큼 퇴실시키고 그 다음에 입실을 진행하면 된다. 입출력 2번째 예제를 토대로 설명하면 아래와 같다.
현재 회의실에 있는 사람들을 리스트(arr)에 넣어보자. 처음에는 1이왔다. 따라서 arr=[1]이다. 이후, leave에서 누가 먼저 떠나는 지 확인한다. 2가 먼저 떠나지만, 현재 회의실에 있는 사람은 1밖에 없으므로, 회의실에 나가는 사람은 없다.
4가 회의실에 두번째로 들어왔다. arr=[1,4]이다. 따라서 1과 4가 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 2가 먼저 떠나지만, 현재 2는 회의실에 없다. 따라서 회의실에 나가는 사람은 없다.
2가 회의실에 세번째로 들어왔다. arr=[1,4,2]이다. 따라서 1과4는 2를 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 2가 먼저 떠나므로 2는 회의실에서 나간다. 그 다음 leave에서 누가 떠나는지 확인해보자. 1이 떠나므로 1은 회의실에서 나간다. 그 다음 누가 떠나는지 확인하면 3인데 3은 회의실에 없다. 결과적으로 회의실에 있는 사람은 4밖에 없다.(arr=[4])
3이 회의실에 들어온다. arr=[4,3]이다 따라서 3,4는 서로 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 3이 떠나므로, 3은 회의실에서 나간다. 그 다음 leave에서 누가 먼저 떠나는지 확인해보자. 4가 떠나므로, 4는 회의실에서 나간다. 모든 사람이 떠났다.
위의 과정을 진행하면서, 각 사람들이 몇 명을 만났는지 세면된다.
다시말해, 현재 회의실에 있는 사람들을 leave의 순서에 맞춰서 보낼 수 있으면 그 순서만큼 먼저 보내고 입실을 받는 것이다. 코드가 간결한편이 아니므로, 다른 사람들이 푼 풀이를 참고하는 것을 권장한다.
def solution(enter, leave):
arr = []
n = len(enter)
answer = [0] * n
i, j, = [0] * 2
while True:
if j == n: break
while arr and j < n:
try:
x = arr.index(leave[j])
del arr[x]
j += 1
except:
break
if i < n:
arr.append(enter[i])
i += 1
if len(arr) > 1:
for p in arr: answer[p-1] += 1 if answer[p-1] > 0 else len(arr) - 1
return answer