[Python]BaekJoon.AC
[Python]백준 BaekJoon.AC 11866 : 요세푸스 문제0(deque, join())
스뇨잉
2022. 1. 24. 17:43
728x90
728x90
https://www.acmicpc.net/problem/11866
11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
연산으로 계산해 빠르게 풀어야 하는 문제인가 싶었는데,
2초라는 넉넉한(?) 시간을 보곤 한 명씩 처리해가며 풀어도 되겠다 싶었다.
학습한 덱을 적용해보는 간단한 기본 문제였다.
오히려 출력을 어떻게 해줄지 고민을 더 많이 했다.
그냥 리스트를 통채로 출력하면 대괄호에 둘러싸여 나오는데.
화살 괄호..? 꺾인 괄호로 출력하기 위해선 리스트를 for문에 넣고 요소만 빼와야 했다.
이걸 한 번에 구현할 수 있는 멋진 방법이 없을까 생각해봤는데,
내겐 새로운 함수인 join을 사용해보기로 했다.
print()를 세 줄로 출력하고 싶지 않았는데..
print("<", end="")
print(", ".join(str(a) for a in ans), end="")
print(">")
처음엔 이런 식으로 출력했다. 코드만 봐도 join의 역할이 대충 감이 온다.
join은 string만 취급하기 때문에 리스트를 string으로 바꿔줬다.
그런데 string은 단어끼리 더해주면 쉽게 합체..? 되기 때문에, + 연산기호를 이용해보고 싶었다.
print("<" + ", ".join(str(a) for a in ans) + ">")
다행히 실행됐다.
이후 다른 코드들을 찾아봤는데, 리스트가 애초에 string 리스트라면
# ans = ['1', '2', '3'] 일 때
print("<" + ", ".join(ans) + ">") 도 가능하다.
출력 : <1, 2, 3>
for문 없이도 구현할 수 있었다.
from collections import deque
N, K = map(int, input().split())
deq = deque()
ans = []
for i in range(1, N+1):
deq.append(i)
while deq:
for n in range(K-1):
p = deq.popleft()
deq.append(p)
ans.append(deq.popleft())
print("<" + ", ".join(str(a) for a in ans) + ">")
728x90
728x90