백준 1179번 문제 - 마지막 요세푸스
https://www.acmicpc.net/problem/1179
- N명의 사람들은 원탁에 둘러 앉아서 시계 방향으로 1번부터 N번까지 번호 부여 받음
- N보다 작거나 같은 K를 정하고, 1번부터 순서대로 K번째 사람 제외시킴
- (N - 1)명이 제외될 때까지 시계 방향으로 K번째 사람을 제외시킴
- 임의의 두 자연수 N과 K (<= N)가 주어질 때, 최후까지 살아 남을 사람의 번호를 구하시오
요세푸스 문제 해결법
1. Queue를 이용하는 방법 (속도 느림)
# n = 6, k = 2
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
q = [i for i in range(1, n + 1)]
while len(q) > 1: # q의 길이가 1보다 크면 1이 될 때까지 반복
for j in range(1, k + 1):
friend = q.pop(0)
if j != k: # j가 k번째가 아니라면
q.append(friend) # 요소를 다시 Queue의 맨 뒤에 추가
return q[0] # q의 길이가 1이 되면 q[0] return
2. Circular Linked List를 이용하는 방법
# N = 6, K = 2
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
q = [i for i in range(1, n + 1)]
j = 0
while len(q) > 1:
j = (j + k - 1) % len(d)
"""
k가 2 니까, 1 2 3 에서
1 -> 2를 가는 것이므로 k - 1을 하는 것임
즉, 1을 더하는 것과 같음
만약 k가 3이면 j에 2를 더할 시 3이 됨
len(d)를 해줘야 범위를 벗어나지 않음
k가 3이면 3으로 갔다가, 다시 6으로 갔을 때, % 연산을 하면
0으로 돌아오니 서큘러 리스트라고 볼 수 있음
"""
q.pop(j) # 제거하는 기능
return q[0]
3. Recurrence Relation(점화식)을 이용하는 방법 (자료구조 안 써서 제일 빠름)
- f(n, k): n과 k가 주어질 때 생존자의 번호
- k번째 사람을 제외하면 n - 1명이 남음
- 다음 게임의 시작 위치는 (k % n) + 1
- f(n - 1, k): 남은 n - 1명이 k번째 사람을 제거할 때 생존자의 번호
점화식: f(1, k) = 1 # 1만 있으면 loop를 몇번 돌든 1이 제거 됨
f(n, k) = (f(n - 1, k) + k - 1) % n + 1
"""
f(n - 1, k)의 위치에 있는 사람을 파악한 이후에
그 다음 위치가 k - 1을 해주면 됨 (서큘러 리스트)
그 다음 % n 을 하고 (코드상으로 len(q)) +1을 해줘야 f(n, k)에서의 생존자가 나옴
"""
# 점화식을 이용한 재귀 호출:
def findTheWinner(self, n: int, k: int) -> int:
if n == 1:
return 1
return ((self.findTheWinner(n - 1, k) + k - 1) % n) + 1
# 동적계획법 (반복문 이용)의 적용: 재귀에서 반복으로
# 동적계획법 (D.P): 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법
def findTheWinner(self, n: int, k: int) -> int:
s = 1
for n in range(1, n + 1):
s = ((s + k - 1) % n) + 1
return s
출처
1. 주니온TV 아무거나연구소 - 요세푸스 문제: 1편 https://www.youtube.com/watch?v=rxgBHPy-GAk
2. 주니온TV 아무거나연구소 - 요세푸스 문제: 2편 https://www.youtube.com/watch?v=MHarxFDYBw8&t=9s
'Information Technology > Algorithm' 카테고리의 다른 글
[Algorithm] 이진 탐색 트리 (0) | 2023.09.29 |
---|---|
[Algorithm] 이진 트리의 재구성 (0) | 2023.09.09 |
[Algorithm] 트리 (Tree) (0) | 2023.09.09 |
[Algorithm] 토끼와 거북이 - 2 (0) | 2023.07.28 |
[Algorithm] 토끼와 거북이 - 1 (0) | 2023.07.26 |