[백준] 18115번 - 카드 놓기 Python

Tuna·2022년 1월 22일
1

Data Structure

목록 보기
22/37

문제


수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다.

  1. 제일 위의 카드 1장을 바닥에 내려놓는다.
  2. 위에서 두 번째 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
  3. 제일 밑에 있는 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.

수현이는 처음에 카드 N장을 들고 있다. 카드에는 1부터 N까지의 정수가 중복되지 않게 적혀 있다. 기술을 N번 사용하여 카드를 다 내려놓았을 때, 놓여 있는 카드들을 확인했더니 위에서부터 순서대로 1, 2, …, N이 적혀 있었다!

놀란 수현이는 처음에 카드가 어떻게 배치되어 있었는지 궁금해졌다. 처음 카드의 상태를 출력하여라.

입력


첫 번째 줄에는 N (1 ≤ N ≤ 106)이 주어진다.

두 번째 줄에는 길이가 N인 수열 A가 주어진다. Ai가 x이면, i번째로 카드를 내려놓을 때 x번 기술을 썼다는 뜻이다. Ai는 1, 2, 3 중 하나이며, An은 항상 1이다.

출력


초기 카드의 상태를 위에서부터 순서대로 출력하여라.

예제 입력 1


5
1 1 1 1 1

예제 출력 1


5 4 3 2 1

예제 입력 2


5
2 3 3 2 1

예제 출력 2


1 5 2 3 4

풀이


from collections import deque
import sys

input = sys.stdin.readline

n = int(input().rstrip())

stack = [i for i in range(n,0,-1)]
ans = deque()
skills = list(map(int,input().rstrip().split()))
skills.reverse()
for skill in skills:
    if skill == 1:
        ans.append(stack.pop())
    elif skill == 2:
        ans.insert(-1,stack.pop())
    elif skill == 3:
        ans.appendleft(stack.pop())
ans.reverse()
print(*ans)

정리


  • 들어온 기술들을 반대로 deque에 삽입해준다. 2 3 3 2 1의 경우에는 1 2 3 3 2의 순서로 카드를 다시 넣어준다.
  • 1의 경우에는 deque의 맨 마지막에 넣어준다.
  • 2의 경우에는 deque의 뒤에서 두 번째에 넣어준다.
  • 3의 경우에는 deque의 맨 앞에 넣어준다.
  • 이렇게 하면 들어온 순서의 반대로 다시 카드를 넣어서 원래 카드의 번호를 알 수 있다.
profile
BE 개발자가 되기 위해 노력하는 사람

0개의 댓글