DolphinDash

백준 1158번: 요세푸스 문제 (Python) 본문

PS/Solve

백준 1158번: 요세푸스 문제 (Python)

DolphinDash 2023. 5. 23. 14:55
 

1158번: 요세푸스 문제

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

www.acmicpc.net

처음엔 linked list로 순환 구조를 만들어서 풀려다가 아직 class를 잘 못다루다 보니 선언부분에서 막혔다.

class node:
    def __init__(self, data) -> None:
        self.data = data
        self.next = None
    
    def nextNode(self):
        return self.next
    
    def setNext(self, next):
        self.next = next

head = Node(1)
head.next = Node(2)
heads = head.next
for i in range(3, N+1):
    heads = heads.next
    heads = Node(i)
heads.next(Node(1))

class에 nextnode를 만들어 다음 node를 가르키게 하려 했는데 한번 호출한 head가 휘발되어 다음 Node를 가르키게 되지 않아 구현하지 못했다.

그다음엔 dictionary를 사용해 index를 직접 더해가면서 false인 부분은 건너뛰고 true인 부분만 체크하여 출력하는 방식으로 구현 해보려 했다.

N, K = map(int, input().split())
ndict = {}
for i in range(1, N+1):
    ndict[i] = True
count = 1
nlist = []
print(ndict)

for i in range(N):
    for j in range(K):
        check = 0
        while True:
            count += 1
            if count > N:
                count = 1
                if ndict[N]:
                    check += 1
            if ndict[count]:
                check += 1
            if check == K:
                break
    ndict[count] = False
    nlist.append(count)
    print(ndict)
print(nlist)

이 또한 복잡한 구조에 패턴이 중간에 꼬여 더 쓰다간 코드가 더 복잡해질 것 같아 다른 방식을 생각했다.

마지막으로 list를 활용해서 앞에서 빼내고 뒤로 넣으면서 직접 카운팅하는 방식이다. pop(0)는 시간복잡도가 O(n)이기 때문에 deque의 popleft()를 사용해 O(1)로 줄였다.

from collections import deque

N, K = map(int, input().split())

nlist = [i for i in range(1, N+1)]
nlist = deque(nlist)
plist = []
for _ in range(N):
    for i in range(K):
        nlist.append(nlist.popleft())
    plist.append(nlist.pop())
print('<' , end='')
print(*plist , sep=', ', end='')
print('>' , end='')

출력은 unpacking하여 리스트를 부분적으로 나눠 구현해줬다.

 

공부한 내용:

 

03. 파이썬으로 연결 리스트 구현하기

## 연결 리스트의 구조와 특징 연결 리스트는 여러 곳의 자료를 연결한 것이다. 연결 리스트는 배열처럼 선형 자료 구조이지만, 연속한 메모리 위치에 값이 저장되는 것은 아니다.…

wikidocs.net

관련된 문제:

 

5397번: 키로거 (Python)

5397번: 키로거 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백

formjonghwa.tistory.com

'PS > Solve' 카테고리의 다른 글

백준 7576번: 토마토 (Python)  (0) 2023.06.28
백준 1010번: 다리 놓기 (Python)  (0) 2023.05.23
백준 1991번: 트리 순회 (Python)  (0) 2023.05.20
백준 16953번: A → B (Python)  (0) 2023.05.19
백준 1629번: 곱셈 (Python)  (0) 2023.04.06