코딩하는 베어브릭

백준 11866번. 요세푸스 문제 0 (파이썬) 본문

알고리즘/백준

백준 11866번. 요세푸스 문제 0 (파이썬)

bearbrick 2022. 7. 2. 22:40

문제

 

https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

 

 

 

문제 풀이

 

1. 1부터 n명의 사람을 리스트로 담는다.

 

2. 위의 리스트에서 k번째가 아니라면 리스트의 첫번째 요소를 다시 맨 뒤로 보내고, k번째라면 리스트의 첫번째 요소를 리스트에서 삭제한다.

 

3. 위의 과정을 공백리스트가 될 때까지 반복한다.

 

import sys
n,k=map(int,input().split())

people=[str(x+1) for x in range(n)]
i=1
res=[]

while people!=[]:
    if i==k:
        res.append(people.pop(0))
        i=1
    else:
        people.append(people.pop(0))
        i+=1

print('<'+", ".join(res)+'>')

 

 

 

더 나은 풀이

 

위의 코드는 k번째를 찾을 때까지 리스트 요소를 pop하고 append하는 과정을 반복했으나, 이 코드는 리스트에서 k번째가 어디에 위치하는 지 바로 찾아 pop한다.

 

import sys
n, k = map(int, input().split())
people = list(range(1, n+1))
res = []
i = 0
while people:
    i = (i+k-1) % len(people)
    res.append(str(people.pop(i)))

print('<'+', '.join(res)+'>')
Comments