728x90
문제 링크 : https://www.acmicpc.net/problem/11866
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
'PS' 카테고리의 다른 글
[백준] 11724 연결 요소의 개수 / 파이썬 (Python) (0) | 2023.03.18 |
---|---|
[백준] 1655 가운데를 말해요 / 파이썬 (Python) (0) | 2023.03.13 |
[백준] 15649 N과 M (1) / 파이썬 (Python) (0) | 2023.03.08 |