[python_파이썬_pass]백준_11866번_요세푸스 문제 0_실버4_풀이

2024. 10. 10. 21:23코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/slUxXU5NCUQ?feature=shared

 

<첫번째 시도 : 맞았습니다.>

이건 인덱싱의 공식을 찾아내면 쉽게 풀 수 있다. 공식 찾는데 30분 걸림.

1, 2, 3, 4, 5, 6, 7   start는 0인덱스 + K - 1 = 최종 2       찾는 index=>          2                   주어진 값 len = 7  

1, 2, 4, 5, 6, 7       start는 2인덱스 + K - 1 = 최종 4                                      4                                            6

1, 2, 4, 5, 7           start는 4인덱스 + K - 1 = 최종 6 ※여기서 막힌다          1                                             5

1, 4, 5, 7                                                                                                       3                                             4

1, 4, 5                                                                                                           2                                             3

1, 4                                                                                                               0                                             2

4                                                                                                                   0                                             1

찾고자 하는 index를 나열한 후 주어진 값들 k와 len을 조합해보고 아차 했다.start의 숫자가 계속 커지는데 단순하게 +만을 하면 안되기 때문에 %을 적용해서 6 % 5를 하면 나머지가 1이 나오는 걸 찾을 수 있다.그 다음 하나씩 해보면 답이 나온다.

import sys
input = sys.stdin.readline

N, K = map(int, input().split())

nums = [i for i in range(1, N + 1)]
answer = []

point_index = 0

while len(nums) > 0:
    point_index = (point_index + (K - 1)) % len(nums)
    answer.append(nums.pop(point_index))

print("<", end = '')

for i in range(len(answer)):
    if i == (len(answer) - 1):
        print(answer[i], end = '')
    else:
        print(answer[i], end=', ')

print(">", end = '')

 

<다른 사람 풀이 참고>

rotate(n)은 n이 양수일 경우 요소들이 오른쪽으로 n칸 만큼 회전

                         음수일 경우 요소들이 왼쪽으로 n칸 만큼 회전 (3번째를 뽑을꺼니까 왼쪽으로 2번만 가면 됨)

그 다음 popleft()로 첫번째 요소 반환 후 append()해주면 깔끔하네.

import sys
from collections import deque

input = sys.stdin.readline


n, k = map(int, input().split())
queue = deque(range(1, n+1))
result = []

while len(queue) > 0:
    queue.rotate(-k+1)
    # print(queue)
    result.append(queue.popleft())

print('<'+ ', '.join([str(i) for i in result])+'>')
728x90
반응형