백준 11886번 바로가기

내 풀이

n, k = map(int, input().split())
arr = [i+1 for i in range(n)]
ans = []

while len(arr) > 1:
  for _ in range(k-1):
    arr = arr[1:] + [arr[0]]
  ans.append(arr.pop(0))

ans.append(arr.pop())

print('<', end='')
print(*ans, sep=', ', end='')
print('>')

색다른 시도

원형을 그대로 사용해볼까?

좋은 생각이야! ^_^

n, k = map(int, input().split())
arr = [i+1 for i in range(n)]
ans = []

i = 0

while len(arr) > 0:
  i = (i+k-1) % len(arr)
  ans.append(arr.pop(i))

print('<', end='')
print(*ans, sep=', ', end='')
print('>')

CODE REVIEW

  1. 원형으로 되어있는 문제가 복잡하길래, 선형으로 변환하여 풀어내었다.
    • 무식한 방법이지만 시간제한이 2초라 넉넉해서 그렇게 시도했다. 1008ms시간 걸렸다.
  2. 색다른 시도에서는 원형을 그대로 사용하기 위해서 index에 신경을 썼다.
    • 기본적으로 (i+k)번째를 불러오면 되지만, 전체 길이를 넘치게 되면 전체 길이로 나눈 나머지번째를 불러오면 된다.

2164 결과

참고!

(n,k)=(7,3)일 때의 처리 과정

1234567
2345671
3456712
3컷
456712
567124
671245
6컷
71245
12457
24571
2컷
4571
5714
7145
7컷
145
451
514
5컷
14
41
14
1컷
4
4컷