ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 1158 : 요세푸스 문제
    코딩테스트/백준 2024. 10. 17. 08:05

    요구사항 

    • 시간 제한 2초, N의 크기도 작아 넉넉하다. 메모리 제한 또한 마찬가지
    • N, K 가 주어질 때 요세푸스 순열을 구하는 프로그램을 출력하라. 

    설계

    • [1, 2, 3, 4, 5, 6, 7] 사람이 앉아 있다고 했을 때,
    • 1, 2번 사람을 7번 뒤로 넣는다. [3, 4, 5, 6, 7, 1, 2]  []
    • 3번사람을 뺄 수 있다. [4, 5, 6, 7, 1, 2]  [3]
    • 4번, 5번 사람을 2번 사람 뒤에 넣는다. [6, 7, 1, 2, 4, 5]  [3]
    • 6번 사람을 뺄 수 있다.  [7, 1, 2, 4, 5]  [3, 6]

    위와 같이 Queue의 성질을 이용해서 문제를 풀 수 있다. 

    추가로  순열을 출력할 때, replace함수와 join함수 중 시간 복잡도가 낮은 걸 택하고 싶어 고민했었다. 

    join 함수는 리스트의 모든 문자열을 하나의 문자열로 결합하기 때문에 O(N)을 갖는다.

    join은 반복 가능한(이터럴) 객체의 요소를 하나의 문자열로 결합하는 데 사용된다. 따라서 리스트에 숫자나 다른 자료형이 있으면 오류가 발생한다. 만약 출력하고 싶다면. 아래와 같이 하면 된다. 

    num_list = [3, 4, 5]
    print(', '.join(map(str, num_list))

     

    replace 함수는 .replace(old, new) old 문자열을 찾아서 new 문자열로 바꾸기 때문에, O(n * m) 의 복잡도를 갖는다.

    여기서 n은 원복 문자열의 길이 m은 교체할 패턴의 길이이다. 

    구현

    from collections import deque
    
    N, K = map(int, input().split())
    queue = deque(range(1, N + 1))
    result = []
    
    while queue:
        for _ in range(K-1):
            queue.append(queue.popleft())
        result.append(queue.popleft())
    
    print("<" + ", ".join(map(str, result)) + ">")

     

    '코딩테스트 > 백준' 카테고리의 다른 글

    [Python] BOJ 10845 큐  (0) 2024.10.21
    [Python] BOJ 17298 : 오큰수  (0) 2024.10.19
    [Python] BOJ 5397 : 키로거  (1) 2024.10.16
    [Python] BOJ 6198 : 옥상 정원 꾸미기  (0) 2024.10.15
    [Python] BOJ 1406 : 에디터  (0) 2024.10.14
Designed by Tistory.