3/14 스터디 문제

hyejun sang·2022년 3월 14일
0

알고리즘

목록 보기
6/28
post-thumbnail

1번 문제.
https://www.acmicpc.net/problem/1158
-> 요세푸스 문제
7개의 수 중에서 3번째 수를 계속해서 없애서 나오는것을 그림으로 아래와 같이 표현했다.

1번 문제 풀이 코드

import sys

# n과 k 값을 각각 입력 받는다.
n, k = map(int, sys.stdin.readline().split())

# 처음 원에 정렬을 위한 리스트
nums = []
for i in range(n):
    nums.append(i+1)

# nums[]에서 제거될 k번째 숫자를 초기화
numIdx = 0
# 요세푸스 정렬을 위한 리스트
josephus = []
# nums[]리스트에서 하나씩 제거할 예정이므로, 길이가 남아 있을때까지 계속 진행될 반복문
while len(nums):
    #  0  1  2  3  4  5  6
    # [1, 2, 3, 4, 5, 6, 7] -> 2 제거되는 값 numIdx = k-1 => numIdx = 3-1 = 2 % 7 = 2
    # [1, 2, 4, 5, 6, 7] -> 4                             => numIdx = 2+3-1 = 4 % 6 = 4
    # [1, 2, 4, 5, 7] -> 1                                => numIdx = 4+3-1 = 6 % 5 = 1
    # [1, 4, 5, 7] -> 3                                   => numIdx = 1+3-1 = 3 % 4 = 3
    # [1, 4, 5] -> 2                                      => numIdx = 3+3-1 = 5 % 3 = 2
    # [1, 4] -> 0                                         => numIdx = 2+3-1 = 4 % 2 = 0
    # [4] -> 0                                            => numIdx = 0+3-1 = 2 % 1 = 0
    numIdx = (numIdx + k - 1) % len(nums)
    # k번째 숫자를 제거하기
    removedNum = nums.pop(numIdx)
    # 제거한 숫자를 받아와 요세푸스에 넣기
    # 문자열로 받아오지 않으면 <3, 6, 2, 7, 5, 1, 4> 이런 꺽새와 같이 나오지 않으므로 str 캐스팅
    josephus.append(str(removedNum))
# '%s 문자열' % '구분자'.join(리스트)
print('<%s>' % ', '.join(josephus))

===============================================

0개의 댓글