문제출처
문제분석
정수 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