ps:problems:boj:1158
요세푸스 문제
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 1158 |
문제명 | 요세푸스 문제 |
레벨 | 실버 5 |
분류 |
Order statistic tree |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=5000 |
사용한 언어 | Python |
제출기록 | 29452KB / 100ms |
최고기록 | 56ms |
해결날짜 | 2021/08/07 |
태그 |
풀이
- 요세푸스 순열을 출력하는 문제
- 1~n까지의 수를 실제로 생성해서 k번째 수들을 하나씩 지워가면서 출력한다. Order Statistic Tree를 사용하면 지워야 할 수를 찾아서 지우는 것을 O(logn)에 처리할 수 있다. 총 시간복잡도는 O(nlogn)이 된다.
- 하지만 n의 크기제한이 작다보니 실제로는 O(n^2) 로 구현한 코드들이 더 빨리 돌아간다. 요세푸스 문제 2 문제는 이 문제와 동일하지만 n의 크기제한을 늘려서 반드시 O(nlogn) 솔루션으로만 풀리도록 바뀌었다.
코드
"""Solution code for "BOJ 1158. 요세푸스 문제".
- Problem link: https://www.acmicpc.net/problem/1158
- Solution link: http://www.teferi.net/ps/problems/boj/1158
Tags: [OrderStatisticTree]
"""
from teflib import segmenttree
def main():
N, K = [int(x) for x in input().split()]
nums = segmenttree.OrderStatisticTree([1] * N)
order = 0
answer = []
for _ in range(N):
order = (order + K - 1) % nums.size()
num = nums.kth(order + 1)
nums.add(num, -1)
answer.append(num + 1)
print('<', end='')
print(*answer, sep=', ', end='>')
if __name__ == '__main__':
main()
- Dependency: teflib.segmenttree.OrderStatisticTree
ps/problems/boj/1158.txt · 마지막으로 수정됨: 2022/05/03 07:07 저자 teferi
토론