728x90
반응형
문제: https://www.acmicpc.net/problem/11866
사용 알고리즘: 덱
입력
- 첫째 줄에 N 과 K 가 빈 칸을 사이에 두고 순서대로 주어짐 (1 <= K <= N <= 1000)
1 번부터 N 번까지 N 명의 사람이 원을 이루며 앉아있을 때, N 명의 사람이 모두 제거될 때까지 K 번째 사람을 제거해 나감.
-> 앞 뒤로 추가/제거가 가능한 덱을 사용해서 원처럼 동작하도록 구현
입력이 7 3 인 경우,
1 2 3 4 5 6 7 의 숫자를 가진 사람들이 원을 그리며 앉아 있을 때, 3 번째 사람을 계속해서 제거해 나가야 한다.
- 1 을 제거하고 다시 뒤에 붙임
2 3 4 5 6 7 1
- 2를 제거하고 다시 뒤에 붙임
3 4 5 6 7 1 2
- 3을 제거 (K = 3)
4 5 6 7 1 2
for 문을 돌면서 K 번째 사람을 제거해 나감.
d = deque(x for x in range(1, N+1)) # 덱에 1~N 번을 미리 넣어둠
results = [] # 결과를 넣을 배열
for i in range(N):
for j in range(K):
if j == K-1: # j == K 일 땐 제거만 함
results.append(d.popleft())
else: # 그 외엔 제거하고 다시 추가
d.append(d.popleft())
출력 형식을 지켜 출력함.
print('<', end='')
for i in range(N):
if i == N-1:
print(results[i], end='')
else:
print(results[i], end=', ')
print('>')
전체 코드
from collections import deque
import sys
input = sys.stdin.readline
# 입력
N, K = map(int, input().split())
d = deque(x for x in range(1, N+1)) # 덱에 1~N 번을 미리 넣어둠
results = [] # 결과를 넣을 배열
for i in range(N):
for j in range(K):
if j == K-1: # j == K 일 땐 제거만 함
results.append(d.popleft())
else: # 그 외엔 제거하고 다시 추가
d.append(d.popleft())
# 출력
for i in range(N):
if i == N-1:
print(results[i], end='')
else:
print(results[i], end=', ')
print('>')
시간 복잡도
- 입력
N, K = map(int, input().split()) # O(1)
- K 번째 사람 제거하는 부분
popleft / append: O(1)
안쪽 for 문은 K 번을 돌고, 바깥쪽 for 문은 N 번을 돌기 때문에 O(K * N) = O(NK) 의 시간 복잡도를 가짐.
d = deque(x for x in range(1, N+1)) # O(N)
results = []
for i in range(N):
for j in range(K):
if j == K-1:
results.append(d.popleft())
else:
d.append(d.popleft())
# O(N) + O(N * K) = O(NK)
- 출력
print('<', end='')
for i in range(N):
if i == N-1:
print(results[i], end='')
else:
print(results[i], end=', ')
print('>')
# O(N)
그래서 총 시간 복잡도는 O(1) + O(NK) + O(N) = O(NK) 이다.
- 입력: O(1)
- K 번째 사람 제거하는 부분: O(NK)
- 출력: O(N)
728x90
반응형
'백준' 카테고리의 다른 글
[백준/Python] 1966 프린터 큐 (0) | 2024.08.08 |
---|---|
[백준/Python] 2164 카드2 (0) | 2024.08.05 |
[백준/Python] 24511 queuestack (0) | 2024.08.02 |
[백준/Python] 2346 풍선 터뜨리기 (0) | 2024.08.01 |
[백준/Python] 9012 괄호 (0) | 2024.07.30 |