식당에서 일하기

면접 대비

시간 제한1초메모리 제한128 MB

요약
항상 파일 2에 접시를 놓고 파일 1에서 꺼내며, 파일 1이 비면 파일 2를 옮기는 결정론적 전략을 시뮬레이션해서 정확한 작업 기록을 출력합니다.
난이도

쉬움10점 중 3점

유형
스택, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

어젯밤 톰은 정말 멋진 여자와 데이트를 했다. 그런데 신용카드를 깜빡하고 안 가져왔고 지갑에 현금도 없어서, 결국 식당에서 일하며 밥값을 갚게 되었다. 그의 일은 종업원이 테이블에서 접시를 가져오면 그것을 받고, 설거지 담당이 요청하면 접시를 넘겨주는 것이다. 접시는 테이블에서 가져온 순서와 똑같은 순서로 설거지되어야 한다. 그렇지 않으면 접시가 설거지되기까지 너무 오래 걸려 음식 찌꺼기가 눌어붙을 수 있기 때문이다. 접시를 모두 손에 들고 있는 것은 좋은 생각이 아니므로, 톰은 종업원이 접시를 건네주면 곧바로 테이블에 내려놓고, 설거지 담당에게 넘길 때가 되면 다시 집어 든다. 테이블에는 접시 더미를 두 개만 놓을 수 있으며, 이를 각각 더미 1, 더미 2라고 부른다. 톰이 쓸 수 있는 테이블은 이 하나뿐이다.

톰은 작년 SWERC에서 우승했으므로 분명히 효율을 잘 따질 수 있다. 그가 받는 접시와 요청의 순서가 주어질 때, 톰이 테이블 위에서 접시를 정리하는 아래에 설명된 구체적인 방식의 기록(transcript)을 출력해야 한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 케이스는 수 NN이 있는 줄로 시작하고 (1≤N≤10001 \le N \le 1000), 이어서 NN개의 줄이 오는데, 각 줄은 DROP m 또는 TAKE m 형태이며 m>0m > 0은 내려놓거나 집어 드는 접시의 수이다. DROP m은 다음 사건이 종업원이 톰에게 접시 mm개를 가져오는 것이어서 그가 테이블에 접시를 내려놓아야 함을 뜻하고, TAKE m은 다음 사건이 톰이 테이블에서 접시 mm개를 집어 올바른 순서로 넘겨주는 것임을 뜻한다. 테이블에 접시가 mm개보다 적을 때 TAKE m 명령을 받는 일은 없으며, DROP 연산에 해당하는 모든 mm 값의 합 MM은 100 000100\,000을 넘지 않는다고 가정해도 된다. 마지막 요청 이후에도 톰의 테이블에 접시가 남아 있을 수 있는데, 톰이 식당이 닫을 때까지 있어야 하는 의무에서 벗어날 수도 있기 때문이다.

입력은 N=0N = 0인 줄로 끝나며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스에 대해, 톰이 수행하는 연산의 기록을 출력한다. 각 줄은 다음 중 하나이다.

  • DROP 1 m 또는 DROP 2 m (m>0m > 0): 종업원에게서 접시를 받아 더미 1(각각 더미 2)의 맨 위에 내려놓는 일을 총 mm번 반복한다.
  • TAKE 1 m 또는 TAKE 2 m (m>0m > 0): 더미 1(각각 더미 2)의 맨 위에서 접시를 집어 설거지 담당에게 넘기는 일을 총 mm번 반복한다.
  • MOVE 1->2 m 또는 MOVE 2->1 m (m>0m > 0): 더미 1(각각 더미 2)의 맨 위에서 접시를 집어 다른 더미의 맨 위에 내려놓는 일을 총 mm번 반복한다.

톰은 항상 들어오는 접시를 더미 2에 내려놓고 항상 더미 1에서 설거지 담당에게 넘기며, 정확히 다음의 결정적(deterministic) 전략을 따른다(그 기록을 그대로 출력해야 한다).

  • 각 DROP m 명령에 대해 DROP 2 m 한 줄을 출력한다.
  • 각 TAKE m 명령을 순서대로 처리한다.
    • 더미 1에 현재 접시가 a>0a > 0개 있으면, k=min⁡(m,a)k = \min(m, a)로 TAKE 1 k를 출력하고, 아직 필요한 접시 수를 kk만큼 줄인다.
    • 그 뒤에도 접시가 더 필요하면(더미 1이 이제 비었다면), 더미 2의 현재 접시 수 bb로 MOVE 2->1 b를 출력하고 — 이는 더미 2의 모든 접시를 더미 1로 옮긴다 — 이어서 아직 필요한 접시 수 rr로 TAKE 1 r을 출력한다.

명령은 주어진 순서 그대로 처리한다. 이 전략은 모든 접시를 도착한 순서와 똑같이 설거지하며, 출력 줄은 최대 3N3N개, 접시 이동 횟수는 최대 3M3M번이다. 서로 다른 케이스의 출력 사이에는 빈 줄을 하나 둔다.

예제1

  1. 예제 1

    입력
    3
    DROP 100
    TAKE 50
    TAKE 20
    3
    DROP 3
    DROP 5
    TAKE 8
    0
    
    예상 출력
    DROP 2 100
    MOVE 2->1 100
    TAKE 1 50
    TAKE 1 20
    
    DROP 2 3
    DROP 2 5
    MOVE 2->1 8
    TAKE 1 8