[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