문제
https://www.acmicpc.net/problem/11866
11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
내가 생각했던 풀이과정
1. K번째 사람을 제거하고, 남은 사람들로 이루어진 원을 따라 계속한다는 점은 원하는 요소를 pop할 수 있게 회전 한 후 pop한다고 생각을 하여 deque를 이용하였다.
2. 원하는 요소를 pop하기 위해 -(K-1) 만큼 회전을 한다. -(K-1) 만큼 회전하는 이유는 좌로 회전하기 위함이다
3. 좌로 회전을 하고 맨 처음 요소를 popleft 한 것을 리스트에 넣는다. 리스트에 넣을 때는 < >안에 넣어야하기 때문에 문자열로 처리해서 넣는다.
4. 문자열로 각 요소를 출력한다.
나의 풀이
from collections import deque
queue = deque()
N, K = map(int, input().split())
result = []
for i in range(N):
queue.append(i + 1)
for j in range(N):
queue.rotate(-(K-1))
result.append(str(queue.popleft()))
print("<%s>" %(", ".join(result)))
다른 사람의 풀이
N, K = map(int, input().split())
circular_list = []
answer = []
for i in range(N): circular_list.append(i+1)
popNum = 0
while len(circular_list) > 0:
popNum = (popNum + (K-1)) % len(circular_list)
popElemnet = circular_list.pop(popNum)
answer.append(str(popElemnet))
print("<%s>" %(", ".join(answer)))
pop 자체를 이용하기 위해 popNum에 K - 1을 더하고 길이만큼 나누는 방식으로 로직을 구성하면 똑같이 구할 수 있다.
새로 알게된 점, 확인해야할 점
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[Baekjoon] 백준 알고리즘: 1057 - 토너먼트 (0) | 2021.06.02 |
---|---|
[Baekjoon] 백준 알고리즘: 9012 - 괄호 (0) | 2021.05.25 |
[Baekjoon] 백준 알고리즘: 2164 - 카드2 (0) | 2021.05.22 |
[Baekjoon] 백준 알고리즘: 1049 - 기타줄 (0) | 2021.05.20 |
[Baekjoon] 백준 알고리즘: 1021 - 회전하는 큐 (0) | 2021.05.18 |
댓글