https://www.acmicpc.net/problem/18115
18115번: 카드 놓기
수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다. 제일 위의 카드 1장을 바닥에 내려놓는다.
www.acmicpc.net
문제
수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다.
1. 제일 위의 카드 1장을 바닥에 내려놓는다.
2. 위에서 두 번째 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
3. 제일 밑에 있는 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
수현이는 처음에 카드 N장을 들고 있다. 카드에는 1부터 N까지의 정수가 중복되지 않게 적혀 있다. 기술을 N번 사용하여 카드를 다 내려놓았을 때, 놓여 있는 카드들을 확인했더니 위에서부터 순서대로 1, 2, …, N이 적혀 있었다!
놀란 수현이는 처음에 카드가 어떻게 배치되어 있었는지 궁금해졌다. 처음 카드의 상태를 출력하여라.
입력
첫 번째 줄에는 N (1 ≤ N ≤ 10^6)이 주어진다.
두 번째 줄에는 길이가 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
Solution
Python
# ver.1 1120ms / 83720KB
N = int(input())
A = list(map(int, input().split()))
topCard, bottomCard = [], []
for i in range(1,N+1):
if A[-i] == 1:
topCard.append(i)
elif A[-i] == 2:
topCard.insert(len(topCard)-1, i)
else:
bottomCard.append(i)
for element in reversed(topCard):
print(element, end=' ')
for element in bottomCard:
print(element, end=' ')
# ver.2 888ms / 125092KB
N = int(input())
A = list(map(int, input().split()))
topCard, bottomCard = [], []
for i in range(1,N+1):
temp = A[-i]
if temp == 1:
topCard.append(str(i))
elif temp == 2:
topCard.insert(-1, str(i))
else:
bottomCard.append(str(i))
topCard.reverse()
print(' '.join(topCard + bottomCard))
'메모장 > 백준 온라인 저지(BOJ)' 카테고리의 다른 글
백준 2872번 - 우리집엔 도서관이 있어 (0) | 2021.12.08 |
---|---|
백준 2630번 - 색종이 만들기 (0) | 2021.12.08 |
백준 1449번 - 수리공 항승 (0) | 2021.12.06 |
백준 11501번 - 주식 (0) | 2021.12.06 |
백준 2847번 - 게임을 만든 동준이 (0) | 2021.12.03 |