[python] 11866_요세푸스 문제0

yeco_ob·2023년 2월 20일
0

알고리즘 문제 풀이

목록 보기
24/24

문제

해결 방법

k번째를 삭제할 때 그 이전의 원소를 리스트의 뒤로 보내며 이 과정을 반복하면 된다. 이 규칙을 생각하는 건 쉬웠는데 소스 코드로 옮길 때 많은 방법 중에서 고민했다.

원형 큐를 만들까... 그냥 큐를 하면 더 간단하겠네... 어떤 함수를 써야하나... 직접 원소를 뒤로 보내야 하나...

그래서 반복문으로 ✨원소를 직접 뒤로 보내는 방법과 ✨rotate()함수로 덱을 돌리는 방법 2가지를 써보았다.

제출

💡 원소를 직접 뒤로 보내기

import sys
from collections import deque
input = sys.stdin.readline

from collections import deque
n, k = map(int, input().split())
s = deque([])
#1~n으로 덱 생성
for i in range(1, n + 1):
    s.append(i)
    
print('<', end='')
#s가 존재하는 동안 반복
while s:
    for i in range(k - 1): #k 이전 원소들 뒤로 보내기
        s.append(s[0])
        s.popleft()
    print(s.popleft(), end='') # k번째 원소 삭제, 출력
    if s:
        print(', ', end='') #쉼표 출력
        
print('>')

💡 함수 사용

import sys
from collections import deque
input = sys.stdin.readline

n, k = map(int,input().split())
s = deque([x for x in range(1,n+1)]) #리스트컴프리헨션

removed = []
while circle:
    s.rotate(-(k-1)) #k이전 원소들을 뒤로 보내기
    removed.append(s.popleft()) #출력할 리스트에 삭제값 삽입
print(f'<{", ".join(map(str,removed))}>')

✨ .ratate() 함수
함수 안에 양수라면 뒤에 있던 게 앞으로,
음수는 앞에 있던 게 뒤로 이동한다.
rotate함수 더보기

0개의 댓글