백준 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])
이 글은
(새창열림)
본 저작자 표시, 비영리 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
Creative Commons
본 저작자 표시
비영리
'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.21https://www.acmicpc.net/problem/17608풀이여러개의 막대기가 일렬로 세어져 있을 때, 오른쪽에서 보았을때 보이는 막대기의 개수를 구하는 문제이다.막대기는 왼쪽에서 오른쪽으로 나열되어 있으며, 각 막대기의 높이가 주어진다.오른쪽에서 왼쪽을 바라볼 때, 더 높은 막대기가 나오지 전까지의 막대기만 보이게 된다.for i in range(N - 1, -1, -1): # 오른쪽에서 왼쪽으로 순회 if max_height 오른쪽에서 왼쪽으로 막대기 리스트를 탐색한다.만약 현재 막대기의 높이가 max_height 보다 크다면, 이는 새로운 보이는 막대기 이므로, count를 증가시킨다.max_height를 현재 막대기의 높이로 갱신한다.시간 복잡도 분석한번의 순회만 이용하므로 O(N…
댓글을 사용할 수 없습니다.