요세푸스 문제 0 [ Python ] [ 백준 : 11866 ]

2023. 5. 26. 21:42알고리즘/백준


풀이 및 회고

 

처음에 문제를 이해하기 어려워 나무위키에 요세푸스 수열을 검색했고 노트에 직접 그려보았다. 

문제에서 deque 패키지에 rotate 를 사용하면 풀 수 있는 문제라고는 생각했다. 

하지만 반복문에서 어떻게 사용하지 에서 막혔었는데 신범님이 rotate를 사용하는 방향을 잡아주셨고 결과에 도달할뻔 하였다.

마지막은 출력이문제였는데 <> 안에 값이 들어가야 하는 것. 그래서 deque 에 있는 값을 list 로 옮겨 join 을 이용해 출력했다.

그리고 코드를 줄일수 있는 방법이 있었는데 이는 리스트 내포 라고 한다.

deque 에 길게 코드를 짜서 넣는 것이 아닌 한번에 deque 에 넣을 수 있었다. 잘 숙지하면 쓸일이 또 생길거 같다.

# 요세푸스 문제 0

from collections import deque

n , m = map(int, input().split())

deq = deque([str(i) for i in range(1, n + 1)])
#리스트 내포 
# for i in range(1, n + 1):
#     deq.append(str(i))
# centi_meter_list = [100*i for i in meter_list] 
list = [] 
# <3, 6, 2, 7, 5, 1, 4>
while len(deq) != 0:
    deq.rotate(-(m-1))
    list.append(deq[0])
    deq.popleft()
    
result = ", ".join(list)
print(f"<{result}>")
# 1. n, m 을 입력받는다.
# 2. deque 에 n 만큼 값을 채워 넣는다.
# 3. while 문을 선언해 deque 에 값이 없으면 탈출하게 만든다.
# 4. while 문에서 n 번째 값을 pop 해서 값을 result 에 넣는다.    hint pop은 선언만 되도 된다
# 5. 출력한다.

# [3, 4, 5, 6, 7, 1, 2]
# rotate(3)
# popleft