BOJ / Implementation / 요세푸스 문제 0 / Python

k_dah·2022년 1월 18일
0

CodingTest

목록 보기
10/16
post-custom-banner

<11866번>

풀이

내 코드1

import sys
input = sys.stdin.readline

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

people = [num+1 for num in range(n)]
idx = 0

print("<", end="")
while people:
    idx += k-1
    if idx > len(people)-1:
        idx %= len(people)
    print(f"{people.pop(idx)}", end="")
    if people:
        print(", ", end="")

print(">")

idx=0 에서 시작해서 k-1을 더해주면서 k번째 차례가 된 원소를 기존리스트.pop(idx)로 기존리스트에서 삭제함과 동시에 바로 출력한다.
기존 리스트의 길이가 0이 될때까지 위의 과정을 반복한다. 이때 idx가 인덱스 범위를 초과했다면 리스트의 길이만큼 나눠준다.(원개념)
출력형태를 맞추는 것도 꽤 신경 써야 했다.

내 코드2

import sys
input = sys.stdin.readline

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

# 1.
people = list(range(1, n+1))
ans = []
idx = 0

while people:
    # 2.
    idx = (idx + k - 1) % len(people)
    ans.append(str(people.pop(idx)))

# 3.
print("<" + ", ".join(ans) + ">")

빈 배열 ans[]를 준비한다.
people 배열이 빌 때까지 idx = (idx + k - 1) % len(people)를 반복하여 그때의 배열 내의 k번째 원소를 찾아낸다.
이때 그 k번째 원소를 ans 배열에 문자열로 바꿔서 저장한다.
그래야 마지막 결과를 출력할 때 .join()을 사용할 수 있다.


📝 문제 풀면서

  1. 리스트 생성 방법 익히기
list(range(숫자범위))
  1. 인덱스가 범위를 초과하지 않는 경우 len(people)로 나눈 나머지값과 같기 때문에 모든 경우에 len(people)로 나눠줘서 코드를 단축한다.

  2. 출력 방법 익히기
    *ans배열에 저장할때 문자열로 바꾸고 저장
    *join함수 익히기

profile
개똥이
post-custom-banner

0개의 댓글