1158 - 요세푸스 문제
1. 개요
https://www.acmicpc.net/problem/1158
2. 코드
Linked List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import sys
class Node:
prev = None
next = None
def __init__(self, i):
self.curr = i
class LinkedList:
head = None
size = 0
def set_head(self, node:Node):
self.head = node
self.curr = node
def append(self, node:Node):
if self.head is None:
self.set_head(node)
self.curr.next = node
node.prev = self.curr
self.curr = node
self.size += 1
def delete(self):
self.curr.prev.next = self.curr.next
self.curr.next.prev = self.curr.prev
self.curr = self.curr.next
self.size -= 1
def set_circle(self):
self.curr.next = self.head
self.head.prev = self.curr
self.curr = self.head
def get_size(self):
return self.size
n, k = map(int, sys.stdin.readline().split(' '))
ll = LinkedList()
for i in range(1, n+1):
node = Node(i)
ll.append(node)
ll.set_circle()
cnt = 1
res = []
while ll.get_size() > 0:
if cnt % k == 0:
res.append(ll.curr.curr)
ll.delete()
else:
ll.curr = ll.curr.next
cnt += 1
ret = '<'
for i in res[:-1]:
ret += (str(i) + ', ')
ret += (str(res[-1]) + '>')
print(ret)
Array
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
n, k = map(int, sys.stdin.readline().split(' '))
arr = list(range(1, n+1))
res = list()
idx = k-1
while len(arr) > 0:
res.append(arr.pop(idx))
idx += (k-1)
while len(arr) > 0 and idx >= len(arr):
idx -= len(arr)
ret = '<'
for i in res[:-1]:
ret += (str(i) + ', ')
ret += (str(res[-1]) + '>')
print(ret)
3. 설명
Linked List (통과 못함)
- 순환형 Linked List를 만들고 하나씩 옮겨 탐색하며
k
번째 마다 pop
Array
- Array에 1부터
n
까지의 수를 전부 넣어 초기화. - Array의
k*m
번째 인덱스에 있는 원소를 pop. (m=1 to 순환횟수)
4. 여정
- Linked List로 시도했을때 시간 초과. -> Array로 변경
- 출력 예시를 따르지 않아 틀림
- 성공
언뜻 보기에는 Linked List가 빨라 보이지만, 이 구조는 하나씩 계속 순환할 수 밖에 없기 때문에 시간이 많이 걸림. 입력 예시의 수가 크지 않기 때문에 Array의 pop으로 충분히 가능.