1158번: 요세푸스 문제 (acmicpc.net)

 

1158번: 요세푸스 문제

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

www.acmicpc.net

 

파이썬 코드.

n, k = map(int,input().split())
arr=[]
size=n
queue = []
for i in range(1,n+1):
    arr.append(i)
front = rear = -1

print('<',end='')

for i in range(n):
    for _ in range(k):
        a=(front+1)%size
        front=a
    print(arr[a], end='')
    if i<n-1:
        print(', ', end='')
           
    rear = front-1
    del arr[front]
    size-=1
    front=rear
   
print('>')

 

deque를 안 쓰고 그냥 원형 queue에서 front랑 rear를 조절하는.. 자료구조 책에 나온 방법으로 풀었던 것 같다. 

 

 

 

2024년 9월에 다시 푼 방법: 위의 풀이보다 시간이 몇십배 단축됨.

#요세푸스 문제
from collections import deque

n, k = map(int, input().split())
arr=deque([i for i in range(1, n+1)])

yosep = []

while len(arr)>0:
    arr.rotate(-(k-1))
    yosep.append(arr.popleft())

print("<" + ", ".join(map(str, yosep))+ ">")

 

#

rotate할 때 양수는 오른쪽으로 미는 거, 음수는 왼쪽으로 미는 거. 직관적으로 왠지 그럴 것 같은 방향임.


#

join이라는 게 있음. 이게 뭐냐면 리스트에 있는 각각의 원소들을 한번에 출력할 수 있게 해주는 메서드인데
join앞에다가 구분자를 쓸 수 있음. 이 경우에는 출력을 쉼표를 넣어서 하면 됨.
그리고 원래 이 기능은 문자열이 원소일 때만 사용 가능하므로 지금은 map이용해서 숫자를 문자열로 바꾼 다음에 출력해야 함.

'알고리즘 PS > Implementation' 카테고리의 다른 글

프로그래머스 카펫  (0) 2024.05.28
프로그래머스 H-Index  (0) 2024.05.27
백준 #2750 수 정렬하기  (0) 2023.08.25
백준 #2577 숫자의 개수  (0) 2023.08.25
백준 #1110 더하기 사이클  (0) 2023.08.25

+ Recent posts