백준 21756 - 지우개 (파이썬)
글 작성자: pental

https://www.acmicpc.net/problem/21756
풀이
주어진 N개의 숫자가 1부터 N까지의 정수로 구성된 큐에서 특정 규칙에 따라 제거되며 마지막 남는 숫자를 출력하는 문제이다.
- 초기 큐 구성
- deque를 활용하여 1부터 N까지의 숫자를 큐에 추가한다.
- 반복적인 삭제 과정
- 큐의 길이가 1보다 클 동안 계속 반복한다
- 현재 큐의 길이를 n이라 할때, 처음부터 시작하여 짝수 번째 인덱스에 있는 원소를 제거한다.
- 홀수번째 인덱스에 있는 원소는 큐의 뒤로 이동시킨다.
- 마지막 남은 숫자 출력
시간복잡도 분석
- 모든 원소를 한번씩 탐색함 → O(N)
최적화 코드
이 문제의 패턴을 관찰하면, 2의 거듭제곱 형태로 숫자가 감소함을 알 수 있다.
즉, N이하의 가장 큰 2의 거듭제곱 수가 정답이 된다.
N = int(input()) power = 1 while power * 2 <= N: power *= 2 print(power)
예를 들어
- N = 6일 때 → 1 2 3 4 5 6 → 2 4 6 → 4 6 → 4
- N = 10일 때 → 1 2 3 4 5 6 7 8 9 10 → 2 4 6 8 10 → 4 8 → 8
즉, 마지막 남는 숫자는 N 이하의 가장 큰 2^k 값.
코드
# 백준 21756 - 지우개 # 분류 : 큐 from collections import deque N = int(input()) queue = deque() for i in range(1, N + 1) : queue.append(i) while len(queue) > 1 : n = len(queue) for i in range(n) : if i % 2 == 0 : queue.popleft() else : queue.append(queue.popleft()) print(queue[0])
'Programming > 백준' 카테고리의 다른 글
백준 25377 - 빵 (파이썬) (0) | 2025.03.25 |
---|---|
백준 10800 - 컬러볼 (파이썬) (0) | 2025.03.24 |
백준 19941 - 햄버거 분배 (파이썬) (0) | 2025.03.22 |
백준 17608 - 막대기 (파이썬) (0) | 2025.03.21 |
백준 17286 - 유미 (파이썬) (0) | 2025.03.20 |
댓글
이 글 공유하기
다른 글
-
백준 25377 - 빵 (파이썬)
백준 25377 - 빵 (파이썬)
2025.03.25 -
백준 10800 - 컬러볼 (파이썬)
백준 10800 - 컬러볼 (파이썬)
2025.03.24 -
백준 19941 - 햄버거 분배 (파이썬)
백준 19941 - 햄버거 분배 (파이썬)
2025.03.22 -
백준 17608 - 막대기 (파이썬)
백준 17608 - 막대기 (파이썬)
2025.03.21
댓글을 사용할 수 없습니다.