[문제 링크] 🔗 백준 2164 - 카드2
백준 2164 문제는 큐(Queue) 자료구조를 활용하여 풀 수 있는 문제이며,
카드를 특정 규칙에 따라 제거하면서 마지막에 남는 카드를 찾는 문제이다.
📌 문제 이해
- 1 ~ N까지의 카드가 순서대로 놓여 있다.
- 맨 위의 카드를 버린다.
- 그다음 맨 위의 카드를 제일 아래로 옮긴다.
- 위 과정을 반복하여 마지막에 남는 카드를 찾는다.
✅ 큐(Queue)의 FIFO(선입선출) 구조를 활용해야 한다.
✅ deque를 사용하면 더 효율적으로 해결할 수 있다.
📌 풀이 방법
이 문제를 해결하는 방법은 두 가지가 있다.
- deque.rotate() 메서드를 사용하는 방법
- popleft()와 append()를 조합하여 직접 구현하는 방법
🔹 1. rotate() 메서드를 이용한 풀이
✅ rotate(-1)을 사용하면 큐의 맨 앞 요소를 맨 뒤로 이동할 수 있다.
import sys
from collections import deque
N = int(sys.stdin.readline().rstrip())
lst = deque([i+1 for i in range(N)])
#print(lst)
while True:
if len(lst) == 1:
break
lst.popleft() # 맨 위 카드 버리기
lst.rotate(-1) # 맨 위 카드를 아래로 이동
print(lst[0])
🔹 실행 예제
입력
6
출력
4
🔹 2. popleft()와 append()를 이용한 풀이
✅ popleft()로 맨 위 카드를 빼고, 다음 카드를 append()로 뒤로 보낸다.
import sys
from collections import deque
N = int(sys.stdin.readline().rstrip())
lst = deque([i+1 for i in range(N)])
#print(lst)
while True:
if len(lst) == 1:
break
lst.popleft() # 맨 위 카드 버리기
lst.append(lst.popleft()) # 다음 카드 뒤로 이동
print(lst[0])
🔹 실행 예제
입력
6
출력
4
📌 두 가지 방법 비교
방법 | 코드 간결성 | 실행 속도 |
rotate() 사용 | ✅ 간결함 | 🚀 빠름 |
popleft() + append() 사용 | ✅ 직관적 | 🚀 빠름 |
💡 둘 다 시간 복잡도는 O(N), 속도 차이는 거의 없다.
💡 개인적으로 rotate() 방법이 간결하여 추천한다!
📌 정리
✅ deque.popleft()를 사용하여 맨 위의 카드를 제거할 수 있다.
✅ deque.rotate(-1)을 사용하면 카드를 아래로 보낼 수 있다.
✅ popleft() + append() 조합을 사용하여 직접 구현할 수도 있다.
✅ 큐(Queue) 개념을 익히기에 좋은 연습 문제이다.
'코딩라이브러리 > 파이썬' 카테고리의 다른 글
파이썬 윤년 계산하기 (with 백준 2753) (1) | 2024.06.07 |
---|---|
[파이썬] 시간 함수 어떻게 쓰나 (with 백준 10699) (2) | 2024.06.05 |
파이썬 스택, 큐 deque (with 백준 18258) (0) | 2024.05.30 |
파이썬 중복제거 set 집합함수 (with 백준 2776) (0) | 2024.05.29 |
파이썬 Counter (with 백준 10815, 10816) (0) | 2024.05.28 |