알고리즘/백준
[백준 / Python] 1158번 요세푸스 문제 | 초코더
cloud_nice
2020. 1. 30. 14:46
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
접근법
이 문제에서는 원의 인덱스가 어떻게 변하는지 살펴보는 것이 핵심이었습니다.
만약 3번째 인덱스를 제거한다고 생각하면, 처음 3번째 사람이 제거된 후에는 제거된 사람 다음사람부터 새로운 시작 인덱스가 되는 것을 이해해야 합니다. 즉, temp+=k-1 이부분에 해당합니다.
그리고 temp를 그냥 넣으면 안되는 이유는 2명이 있을때 3번째 사람을 제거하려면 1 2 1 이런식으로 세어지기 때문에 꼭 %를 이용해야합니다. 즉, temp=temp%len(nums) 이부분에 해당합니다.
나의 풀이
import sys
n,k=map(int,sys.stdin.readline().split())
nums=[p for p in range(1,n+1)]
ans=[]
temp=k-1
for i in range(n):
#위치가 리스트를 넘지않으면
if len(nums) > temp:
#제거하고 답으로 추가
ans.append(nums.pop(temp))
#temp번째 수가 제거 되었고 (k-1)만큼 다음수가 시작이므로
temp+=k-1
#위치가 리스트를 넘으면
elif len(nums) <= temp:
temp = temp%len(nums)
# 제거하고 답으로 추가
ans.append(nums.pop(temp))
# temp번째 수가 제거 되었고 (k-1)만큼 다음수가 시작이므로
temp += k-1
print('<',end='')
for i in ans:
if i==ans[-1]:print(i,end='')
else: print("%s, "%(i),end='')
print('>',end='')