PS

[백준] 11866 요세푸스 문제 0 / 파이썬 (Python)

young604 2023. 3. 11. 22:31
728x90

문제 링크 : https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

thinking

처음엔 뭔 소리야...? 하고 바로 요세푸스 검색해봤다.

실화를 바탕으로 한 순열인데 결국 본인이 죽음 당하기(?) 전에 최후의 2인이 되는 법,,,이었다.

이 문제의 키포인트는 k번째의 사람을 제거하는 것이다.

deque 라이브러리를 사용하여 큐로 구현했고 k= 3일때, 즉 index가 k-1일때

popleft()하여 결과 리스트에 저장한 후, 문제에서 원하는 방식대로 출력해주면 된다. 

from collections import deque
n, k = map(int, input().split())
p = deque(range(1, n+1))
res = []
for i in range(n):
    while p:
        p.rotate(-(k-1))
        res.append(p.popleft())

        #for _ in range(k-1):
        #     p.append(p.popleft())
        # res.append(p.popleft())
# print(*res)
print(str(res).replace('[', '<').replace(']', '>'))

deque.rotate(num) 

처음에는 for문으로 k-1까지 돌려 popleft -> append 하는 식으로 구현했는데,

rotate() 내장 함수를 사용하면 아주 간단하게 구현할 수 있다.

rotate()는 요소를 회전하는 함수이다.

rotate(1)은 오른쪽으로 요소 1개 회전, rotate(-1)는 왼쪽으로 요소 1개가 회전한다.

즉, 음수면 제일 앞에 있던 요소가 뒤로 이동한다. 헷갈리니까 하나만 외우자!

replace(old, new, count)

join()은 써봤으니 새로운 함수를 적용해보았다. replace()는 문자열을 변경하는 함수로,

특정 문자를 지정하고, 그 문자를 새로운 문자로 변경할 수 있다.

count에 횟수를 지정하면 해당 문자열을 횟수만큼 바꿔준다. (생략하면 전체 변경)

replace는 문자열을 변경하는 함수이기때문에 꼭 res를 string 타입으로 변환 후 사용해야한다.

문제에서 바꿔야 할 괄호가 2개였으므로, replace함수 또한 2번 사용하였다!

728x90