BOJ 11866. 요세푸스 문제 0 (Python)
2021. 2. 17. 02:10ㆍProblem Solving/BOJ
BOJ 11866. 요세푸스 문제 0
https://www.acmicpc.net/problem/11866
풀이
먼저 위의 그림처럼 그려보면서 문제를 이해하면 빠르다.
문제의 핵심은 원인 점과, 계속 3번째 사람을 구해야 하는데, 제거된 사람이 있는 자리는 건너 뛰어야 한다는 것이다.
나는 리스트를 이용해서, 제거된 사람을 -1
로 표시하여 건너 뛰도록 하는 방법으로 구했다.
for _ in range(N):
cur %= N
next = 0
-
cur
은 현재 위치이다. for 루프를 돌 때 마다cur %= N
을 해주어cur
이 항상 N보다 작게 해주어 인덱스를 벗어나지 않게끔 한다. -
next = 0
으로 설정하고 while문을 시작한다.if next == K - 1 and li[(cur + next) % N] != -1: result.append(li[(cur + next) % N]) li[(cur + next) % N] = -1 cur += K break
next = K - 1
이면서,li[(cur + next) % N]
의 값이 -1이 아니면, 즉 제거된 사람이 아니면 결과에 append하고 제거한다(-1로 표시함)
이때 항상N
으로 나누어 주어out of range
하지 않도록 주의한다.cur += K
해주어 현재 위치를 갱신한다.
if li[(cur + next) % N] == -1: cur += 1 continue
- 제거 된 인덱스일 경우엔
cur += 1
하고 아무것도 하지 않고 건너 뛴다
next += 1
- 위의 경우에 하나도 해당하지 않을 경우엔 next를 증가시킨다.
-
그렇게 다시 N번 루프를 돌면 된다.
위의 그림의 상황은 3,6,2,7이 제거된 상황이다.
1이 cur이였을때, 현재 -1도 아니고 next가 K-1도 아니므로 next를 증가하고
다음은 두번 다 제거된 인덱스이므로 cur을 두번 증가시킨다.
그렇게 되면 cur+next가 4를 가리키고 4는 -1도 아니므로 next를 1 증가시켜 next가 2가되고 5를 결과에 추가한다.
전체 소스코드
풀이
N, K = map(int, input().split())
li = [i for i in range(1, N + 1)]
result = []
cur = 0
for _ in range(N):
cur %= N
next = 0
while True:
# next가 K가 되면 제거
if next == K - 1 and li[(cur + next) % N] != -1:
result.append(li[(cur + next) % N])
li[(cur + next) % N] = -1
cur += K
break
# 제거 된 인덱스일 경우
if li[(cur + next) % N] == -1:
cur += 1
continue
# 아무것도 해당하지 않을경우 next증가
next += 1
print("<", end="")
for i, n in enumerate(result):
if i == len(result) - 1:
print(n, end="")
else:
print(n, end=", ")
print(">")
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
BOJ 1620. 나는야 포켓몬 마스터 이다솜 (Python) (0) | 2021.02.19 |
---|---|
BOJ 11723. 집합 (Python) (0) | 2021.02.19 |
BOJ 10828. 스택 (Python) (0) | 2021.02.16 |
BOJ 10816. 숫자 카드 2 (Python) (0) | 2021.02.16 |
BOJ 9012. 괄호 (Python) (0) | 2021.02.16 |