알고리즘/백준[baekjoon]

[baekjoon]백준 11866번 : 요세푸스 문제 0 (by python 파이썬)

코딩하는이씨 2022. 3. 28. 00:41
728x90
반응형

https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

 

code

from collections import deque
 
n, k = map(int,input().split())
deq = deque()
for i in range(1,n+1):
    deq.append(i)

print('<',end='')
while deq:
    for i in range(k-1):
        deq.append(deq[0])
        deq.popleft()
    print(deq.popleft(),end='')
    
    if deq:
        print(', ',end='')
print('>')

 

이번문제는 처음에는 큐로 해결할 생각을 하지 못하고 리스트로 해결했었다.

 

 

오답 코드는 아래와 같다.

import sys
input  = sys.stdin.readline

n, k = map(int,input().split())
x = k
a = [i for i in range(1,n+1)]
y = []
print("<",end='')
while True:
    
    if len(a) == 1:
        print(a[0],end='')
        break
    if k != len(a)*2 and k!=len(a)*3:
        if k> len(a):
            k = k % len(a)
    else:
        k = len(a)

    print(a.pop(k-1), end =', ')
    k = k-1+x

print(">")

해당 코드는 컴파일러에서는 정상 작동하는데 백준에서는 틀렸다고 뜬다.

 

아무래도 여러 수가 대입되는 과정에서 예제의 수 말고 특정 수에서 내가 생각하지 못한 변수때문에 오류가 뜨는 것

같다.

 

또 여러 조건들을 생각하다 보니 코드가 복잡한면이 있다.

(정확히 왜 틀렸는지는 한번 찾아봐야겠다.)

 

이러한 문제를 deque를 이용하여 해결할 수 있었는데,

k번째 수를 빼고 출력할때 해당 인덱스를 찾아가는 것이 아닌 deque로 순환시켜 해당 인덱스를 맨앞으로 끌어오고,

출력후 제거하는 방식으로 하면 간단히 풀 수있다.

 

또한 마지막에 if문을 통해 deq속의 수가 없으면 ,를 출력하지 않게 하여 문제가 원하는 출력방식으로 구현할 수 있었다.

 

 

728x90
반응형