[ 백준 / Python ] 2164 - 카드2

문제출처

 

문제분석

정수 n을 입력 받은 후 로직에 따라 최후에 남는 카드 번호를 반환하는 로직을 짜야한다. 컨테이너에 1부터 n까지의 카드가 있고 맨 앞의 카드는 제거, 그 다음 카드는 덱의 가장 뒤로 보낸다. 카드가 하나가 남을 때까지 과정을 반복한다. 로직을 정리하면 다음과 같다.

1. n을 입력받음
2. 정수 1부터 n까지를 아이템으로 갖는 컨테이너 생성
3. 컨테이너에서 가장 앞 아이템 제거
4. 컨테이너에서 가장 앞 아이템을 맨 뒤로 보내기
5. 컨테이너에 남은 아이템의 갯수가 1개일 때까지 3,4 단계 반복
6. 남은 아이템 반환

코드구현

from sys import stdin
from collections import deque

input = stdin.readline

n = int(input())

queue = deque([x for x in range(1, n + 1)])

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

print(*queue)

배운점

큐 구현

파이썬으로 큐를 구현하기 위해서는 list, deque 등을 사용할 수 있다. 나는 deque를 사용했다. deque으로 큐를 구현하고 사용하는 법은 다음과 같다.

 

큐 생성하기

from collections import deque

queue = deque()

 

넣고자 하는 아이템들을 인수로 넣을 수 있다.

from collections import deque

queue = deque([1,2,3,4,5])

 

큐에 아이템 추가

queue.append(1)

append()를 통해 큐의 Enqueue를 할 수 있다. 아이템은 가장 뒤에 추가된다.

큐에 아이템 삭제

queue.popleft()

popleft()를 통해 큐의 dequeue를 할 수 있다. 가장 앞의 아이템이 제거된다.

 

deque를 활용하여 구현한 큐 정리

from collections import deque

queue = deque([1,2,3,4,5])

queue.append(6)
print(*queue) # 1 2 3 4 5 6

queue.popleft()
print(*queue) # 2 3 4 5 6