728x90
반응형
문제
수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다.
1. 제일 위의 카드 1장을 바닥에 내려놓는다.
2. 위에서 두 번째 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
3. 제일 밑에 있는 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
수현이는 처음에 카드 N장을 들고 있다. 카드에는 1부터 N까지의 정수가 중복되지 않게 적혀 있다. 기술을 N번 사용하여 카드를 다 내려놓았을 때, 놓여 있는 카드들을 확인했더니 위에서부터 순서대로 1, 2, …, N이 적혀 있었다!
놀란 수현이는 처음에 카드가 어떻게 배치되어 있었는지 궁금해졌다. 처음 카드의 상태를 출력하여라.
- 입력
1. 첫 번째 줄에는 N (1 ≤ N ≤ 106)이 주어진다.
2. 두 번째 줄에는 길이가 N인 수열 A가 주어진다. Ai가 x이면, i번째로 카드를 내려놓을 때 x번 기술을 썼다는 뜻이다. Ai는 1, 2, 3 중 하나이며, An은 항상 1이다.
- 출력
초기 카드의 상태를 위에서부터 순서대로 출력
문제 이해 및 해석
- 카드가 앞/뒤로 빠지고 넣어지니 collections 라이브러리의 deque를 사용한다
- N을 입력받아 결과인 1~N의 카드를 구성한다. : N = int(input()) / after = deque(range(1,N+1))
- rule의 순서를 받는데 rule의 순서에 따라 after이 역을 쌓이는 것이니, 마지막 rule부터 생각해주면서 맨 위에 쌓인 after(after 첫번째)부터 생각한다(서로 역방향으로 생각)
: rule = deque(int, input()), t=rule.pop, a= after.popleft() - 1번째 룰은 가장 위의 카드를 내려 놓는 것이니, 역으로 해당 카드를 맨 위에 쌓는다.
: if t == 1 : before.appendleft(a) - 2번째 룰은 위에서 두번째에 있는 카드를 내려 놓는 것이니, 역으로 해당 카드를 before의 1번째에 위치시킨다.
: if t==2 : before.insert(1,a) - 3번째 룰은 제일 밑에 있는 카드를 내려 놓는 것이니, 역으로 해당 카드를 before의 가장 마지막에 위치시킨다.
: if t ==3 : before.append(a) - 값만 출력하고 싶으므로 print를 할때 덱 앞에 *를 붙여줌
728x90
반응형
'CS > 문제풀이' 카테고리의 다른 글
[백준] 7785번 : 회사에 있는 사람 (0) | 2021.04.25 |
---|---|
[백준] 15903번 : 카드 합체놀이 (0) | 2021.04.25 |