접수 사건 events를 순서대로 처리해요. 항목 [kind, id]에서 kind=0은 대기열 맨 뒤 접수, kind=1은 해당 id의 영구 취소, kind=2는 다음 유효 접수 한 건의 처리 요청이에요. kind=2의 id는 항상 0이며 무시해요.
처리 요청마다 취소된 접수를 건너뛰고 가장 먼저 접수한 유효 id를 반환 목록에 넣어요. 없으면 0을 넣어요. 아직 접수되지 않은 id도 취소할 수 있고, 취소된 뒤 접수되면 유효하지 않아요. 이미 처리한 결과는 나중 취소로 바뀌지 않아요.
solution(events)의 잘못된 한 줄을 고쳐 주세요. incoming·ready 두 리스트의 제공 구조를 유지해요.
매개변수와 반환값
- 사건 수 n은 1
500, 접수·취소 id는 11,000이에요. - kind=0의 id는 전체 사건에서 서로 달라요. 취소는 같은 id에 여러 번 일어나도 돼요.
- 반환 리스트는 kind=2 사건마다의 결과이며 처리 요청이 없으면 빈 리스트예요.
예시
events = [[0, 7], [0, 8], [0, 9], [1, 8], [2, 0], [2, 0], [2, 0]]이면 결과는[7, 9, 0]이에요.events = [[1, 4], [0, 4], [0, 5], [2, 0], [2, 0]]이면 결과는[5, 0]이에요.
실행용 입출력
첫 줄에 n, 다음 n줄에 kind id를 입력해요. 결과들을 한 줄에 출력하고 빈 리스트이면 빈 줄을 출력해요.
예시 입력
7 0 7 0 8 0 9 1 8 2 0 2 0 2 0
예상 결과
7 9 0
예시 입력
5 1 4 0 4 0 5 2 0 2 0
예상 결과
5 0
핵심 개념
stack-queue: 리스트 끝에서.append하고.pop()하면 가장 나중 항목이 먼저 나오는 스택이에요. 두 스택 사이에서 순서를 뒤집으면 접수 순서인 FIFO를 만들 수 있어요.array-1d:ready에는 지금 처리할 접수들이 있고incoming에는 그 뒤에 접수된 항목들이 있어요. ready가 비었을 때만 옮겨요.conditionals:set()·.add·not in으로 취소 id를 기록하고 유효한 접수인지 확인해요.
.pop() 또는 .pop(-1)은 마지막 항목을 꺼내요. .pop(0)은 첫 항목을 꺼내요. while incoming·if not ready는 리스트에 항목이 있는지 확인해요. break는 현재 반복을 끝내며 취소된 항목이면 다음 반복에서 다시 확인해요.
입력 하네스의 input()은 한 줄의 문자열을 읽고, .split()은 공백으로 항목을 나눠요. map(int, ...)는 각 항목을 정수로 바꾸고 list(...)는 그 결과를 리스트로 모아요. range(n)은 0부터 n-1까지 반복해요. 하네스는 함수 호출을 위한 자체 연결이며 풀이의 반환 계약과 구분해요.