문제

[BaekJoon] 2164 카드2


풀이

일단 문제 요약을 한 다음에 바로 구현해봤다.

  1. n 장의 카드. 1~n까지의 번호
  2. 1번 맨 위 n번 맨 아래
  3. 제일 위 카드 버리고 제일 위 카드를 제일 아래로.
  4. 1234 : 1버림 (234) - 2아래로 - 342 - 3버림 (42) - 4 아래로 24 - 2버림 - 4남음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
from collections import deque

n = int(sys.stdin.readline())

q = deque(range(1, n+1))

for _ in range(len(q)):
    q.popleft()
    q.append(q.popleft())
    if len(q) == 1:
        break

print(q[0])
  1. 1부터 입력받은 n까지 범위의 deque()를 만들고,
  2. 제일 왼쪽을 위로 생각해 왼쪽값을 popleft()로 버린 다음,
  3. 제일 위 값을 지워주면서 맨 아래에 append 한다.
  4. q에 값이 하나 남으면 break한다.

결과는 잘 나왔는데 왜 IndexError,,?

아마 for문에서 loop가 q만큼의 고정된 반복횟수로 실행되기 때문이지 않았을까 싶었다.

그래서 while문이 q의 길이가 1이 될 때 까지 loop를 반복하도록 수정하였다.

1
2
3
4
5
6
7
8
9
10
11
12
import sys
from collections import deque

n = int(sys.stdin.readline())

q = deque(range(1, n+1))

while len(q) > 1:
    q.popleft()
    q.append(q.popleft())

print(q[0])

정답.. IndexError 뜨면 for문 잘보고 while문도 생각해보자 메모.

Leave a comment