문제에서 입실과 퇴실이 동시에 이뤄지는 경우가 없다는 사실을 이용하자. 핵심은 현재 회의실에 있는 사람들을 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