반응형
문제
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
코드
n, k = map(int, input().split())
num = list(i for i in range(1, n+1))
ans = []
idx = k - 1
for i in range(n):
if len(num) <= idx:
idx = idx % len(num)
ans.append(num.pop(idx))
idx += k - 1
print("<", end="")
for i in range(len(ans)-1):
print(''.join(str(ans[i]) + ", "), end="")
print(ans[-1], end="")
print(">")
설명
우선 n, k를 입력받고, n의 수만큼의 리스트를 생성해 주자.
그리고 idx를 하나 생성해서 k-1로 지정해 주자(3을 빼려면 인덱스는 2가 되어야 함)
이제 반복문을 돌며, 수를 제거하자.
num 리스트의 개수가 idx보다 큰 경우에는,
num의 idx를 pop 한 수를 ans에 넣어주면 된다.
그렇지 않은 경우엔,
idx를 num의 개수로 나눈 나머지가 idx가 된다(3명 중에 5번이면 5 % 3을 한 2가 idx가 된다.)
그리고 idx를 k-1만큼 늘려준다.
이게 처음에 이해가 어려웠는데,
기존 리스트에서 1개가 빠졌으므로 그만큼 빼고 이동한다는 개념으로 이해했다.
반복문을 다 돌면 ans를 출력해 주면 되는데 출력 형식이 복잡하다.
우선 "<"를 출력하고 end=""으로 해주어 공백을 제거하고 출력이 가능하게 하자.
이후 ans의 마지막 수를 제외하고 반복문을 돌며 "숫자, " 형식의 출력을 해준다.
마지막 수는 따로 출력해 주고,
">"를 출력해서 출력 형식을 맞춰준다.
반응형
'개발 연습장 > 백준 문제풀이' 카테고리의 다른 글
[파이썬, Python] 백준 1012: 유기농 배추 (0) | 2023.04.13 |
---|---|
[파이썬, Python] 백준 15650: N과 M (2) (0) | 2023.04.12 |
[파이썬, Python] 백준 1475: 방 번호 (0) | 2023.04.10 |
[파이썬, Python] 백준 15649: N과 M (1) (0) | 2023.04.07 |
[파이썬, Python] 백준 1927: 최소 힙 (0) | 2023.04.06 |