문제요약
나의 코드 및 설명 - 리스트를 이용한 풀이
- 1부터 n까지의 수를 저장한 <num_li> 리스트를 생성하고, 정답으로 출력할 요세푸스 순열을 저장할 리스트를 <ans>로 초기화한다.
- <num_li> 의 요소가 다 제거될 때 까지 반복하는 while문을 생성한다.
num_plan_idx : 제거되어야 할 인덱스
if len(num_li) == 0 : 만약 num_list에 저장된 요소가 하나도 없으면 반복문을 탈출한다. (다음 작성한 코드에서 len(num_li)로 나누어야 하는 경우가 나오는데, 0으로 나눠지는 것을 방지한다.)
num_li의 인덱스 num_plan_idx의 값을 pop() 함수를 통해 제거하고, ans에 저장한다. 그 다음, 다음에 수행될 반복에 대해 num_plan_idx 를 갱신해주어야 하는데, num_li 의 요소가 하나 삭제가 되었으므로 다음 반복 시 ans에는 인덱스 num_plan_idx + k 에서 1을 빼준 인덱스 <num_plan_idx + (k-1)> 의 값이 ans에 저장되어야 한다. 인덱스의 범위가 리스트의 길이 - 1을 초과하면 안되므로 len(num_li)의 나머지에 해당하는 값을 num_plan_idx 의 값으로 갱신시킨다.
n, k = map(int, input().split())
num_li = list(range(1,n+1))
ans = []
num_plan_idx = k-1
while num_li:
ans.append(num_li.pop(num_plan_idx))
if len(num_li) == 0:
break
else:
num_plan_idx = (num_plan_idx + (k-1)) % len(num_li)
print("<",end="")
for i in range(len(ans)):
if i == len(ans)-1:
print(ans[i],end="")
else:
print("{}{}".format(ans[i],", "),end="")
print(">")
다른 코드 및 설명 - queue 를 이용한 풀이
- queue = deque(range(1, n+1)) : deque() 를 통해 큐를 생성한다.
- for _ in range(k-1) : k-1 만큼 수행하는 반복문을 생성한다.
queue.append(queue.popleft()) : idx = 0 ~ k-2 까지 큐에서 제거하고, 큐의 뒤에 추가한다. 이렇게 함으로써 제거해아할 큐의 요소가 가장 첫 번째 인덱스로 오게된다.
첫 번째 인덱스의 값을 제거하고 ans에 저장한다.
from collections import deque
n, k = map(int, input().split())
queue = deque(range(1, n + 1))
ans = []
while queue:
for _ in range(k-1):
#[1,2,3,4,5,6,7] 에서 k = 3일때,
#queue 에서 뺀 1,2 를 queue의 제일 마지막에 놓음으로써
#빼야될 수를 가장 첫 번째 요소에 둔다.
#[3,4,5,6,7,1,2]
queue.append(queue.popleft())
ans.append(queue.popleft())
print(str(ans).replace('[','<').replace(']','>'))
피드백
리스트를 사용하여 간단하게 구현할 수 있어서 만족했었지만, 큐를 이용한 풀이를 보고 깜짝 놀랐다. 어떻게 이런 생각을 할 수 있는걸까.. 제거해야할 수가 k라면, k-1 까지 popleft() 메서드를 통해 제거하고 큐의 뒤에 붙인 후, 제거해아할 수인 k를 큐의 가장 첫 번째 인덱스로 놓는다.. 이러한 문제가 주어졌을 때 리스트로 문제를 해결하는 것 보다, 큐로 문제를 해결하면 더 간단하고 빠를 수 있다는 것을 항상 명심하자.
'Baekjoon > IM Level' 카테고리의 다른 글
[백준] 11866 파이썬 (실버5) / 큐, replace() : 문자열을 변경하는 함수 (0) | 2023.03.24 |
---|---|
[백준] 10431 줄세우기 (실버5) (0) | 2023.03.24 |
[백준] 2491 수열 (실버4) / DP(다이나믹 프로그래밍) (0) | 2023.03.24 |
[백준] 10157 자리 배정 (실버4) (0) | 2023.03.24 |
[백준] 14696 딱지놀이 (브론즈1) / 리스트 간의 비교연산자 (0) | 2023.03.23 |