파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 1158번 파이썬

gogi masidda 2022. 6. 29. 17:22

문제 링크
https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

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

www.acmicpc.net

이해한 방법


K가 3이란 뜻은 3번째 사람마다 죽여야한다는 의미다. 이를 위해서는 주기가 2가 되어야한다. 그래서 사람 한 명을 죽일 때마다 ‘없애야하는 인덱스’를 2씩 더해주어야한다. 하지만 없애야하는 인덱스보다 남은 사람 수가 적다면 문제가 생긴다.
‘2씩 더한 결과로 생기는 없애야하는 인덱스’와 ‘파란색으로 표시한 요세푸스 순열의 규칙에 따른 없애야하는 인덱스’를 비교해보면, (남은 사람 수 %  2씩 더한 결과로 생기는 없애야하는 인덱스 = 파란색으로 표시한 없애야하는 인덱스)가 된다.  (ex. 5 % 6 = 1)


정답 코드

import sys

N, K = map(int,sys.stdin.readline().split())
list = []
result = []
num = 0 

for i in range(1,N+1):
  list.append(i)

for i in range(N):
  num += K-1
  if num >= len(list):
    num = num % len(list)
  result.append(str(list.pop(num)))
  
print("<",", ".join(result)[:],">",sep='')
728x90