문제 링크
https://www.acmicpc.net/problem/1835
1835번: 카드
첫 번째 줄에 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다.
www.acmicpc.net
시간 제한 / 메모리 제한
2 초 | 128 MB |
문제
1부터 N까지의 숫자가 적힌 카드가 있다. 찬유는 이 카드를 가지고 마술을 하려 한다. 마술을 하는 순서는 다음과 같다.
- 먼저 1부터 N까지의 숫자가 적힌 카드에서 첫 번째 카드를 가장 뒤로 옮긴다. 그러고 나서 첫 번째 카드를 책상 위에 올려놓는다. 그런데 그 카드는 1이 되어야 한다.
- 그리고 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고, 또 가장 앞에 있는 카드를 가장 뒤로 옮긴다.(2번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는다. 그런데 그 카드는 2가 되어야 한다.
- 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고... (3번 반복) 그리고 가장 앞에 있는 카드를 책상위에 올려놓는데 그것은 3이 된다.
- 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고.. (4번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는데 그것은 4이다.
- 위 과정을 계속 반복하여 N번 카드만 남을 때 까지 반복한다.
위와 같은 카드를 하려면 미리 카드의 순서를 알고 있어야 한다. 카드의 개수 N이 주어져 있을 때 위의 마술을 하기 위한 카드의 초기 순서를 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다.
출력
첫 번째 줄부터 N번째 줄까지 차례로 카드의 순서를 출력한다.
예제 입력
4
예제 출력
2 1 4 3
힌트
- 2 1 4 3에서 2를 가장 뒤로 옮긴다. (1 4 3 2)
- 1을 책상 위에 옮겨놓는다. (4 3 2)
- 4 3 2 에서 4, 3을 뒤로 옮긴다. (2 4 3)
- 2를 책상 위로 옮겨놓는다. (4 3)
- 4 3 에서 가장 앞에 있는 것을 뒤로 3번 옮긴 다. (3 4)
- 3을 책상 위로 옮겨놓는다. (4)
- 4를 책상 위로 옮겨놓는다. (완료)
풀이 코드
from collections import deque
n = int(input())
d = deque()
d.append(n)
# 역순으로 수행해서 배열에 저장
for i in range(n-1, 0, -1):
d.appendleft(i)
for j in range(i):
d.appendleft(d.pop())
print(*d)
앞, 뒤 모두 삽입 삭제가 가능한 덱 자료구조를 활용하는 문제이다. n을 덱에 넣고, n부터 1까지 역순으로 반복하며 앞에 i를 appendleft한 뒤, 맨 마지막 원소를 pop하여 또 다시 맨 앞으로 appendleft하는 과정을 i번 반복한다.
'CS > Problem-solving' 카테고리의 다른 글
백준 4158번 파이썬 (0) | 2022.04.29 |
---|---|
백준 23757번 파이썬 (0) | 2022.04.29 |
백준 2164번 파이썬 (0) | 2022.04.26 |
백준 9012번 파이썬 (0) | 2022.04.26 |
백준 1145번 파이썬 (0) | 2022.04.24 |
댓글