본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 1158 요세푸스 문제

/  제출 1  /

 

import sys
from collections import deque
input = sys.stdin.readline


n, k = map(int, input().split())

nums = deque([i for i in range(1, n + 1)])
turn = k - 1
yosepus = []
while nums:
  if turn > 0:
    nums.append(nums.popleft())
    turn -= 1
    continue
  yosepus.append(nums.popleft())
  turn = k - 1

print("<" + ", ".join(list(map(str,yosepus))) + ">")

 

시간 제한이 너무 적어서 혹시 시간 초과나는 풀이일 수 있어 불안해하면서 제출했는데 다행히도 무사히 넘어갔다.

왜냐하면 전체 숫자 배열을 원하는 결과를 얻을 때까지 정말 계속 순회하는 거라 이 문제가 의도한 게 이게 맞나 싶었는데, K와 N의 값이 5000이하이므로 적절하게 넘어간 것 같다.

나에게 나름 신선하고 재밌었던 문제라서 다른 분들의 풀이가 기대된다. 

 

사실 뭔가 다른 문제 풀었을 때 봤던 풀이가 있는데 정답 맞추기였나.. 배열에서 원하는 부분 뽑을 때 % 연산자로 푸는 방식이 있었는데 그 때 덜 이해했었었는지 어떻게 해봐야할 지 감이 안 잡혔다. 이런 식으로 하면 시간 단축을 더 할 수 있지 않을까 싶은데.. 누군가 이런 풀이법으로 풀었다면 좋을텐데.

 

 

 

/  다른 분들 풀이  /

 

from collections import deque

n,k=map(int,input().split())
q=deque([i for i in range(1,n+1)])
a=[]

for i in range(n):
    q.rotate(-k+1)
    a.append(q.popleft())
    
print('<'+', '.join(map(str,a))+'>')

: rotate() ..? 호오.. 어색하다.

 

여기서 나온 메서드인 듯하다.

 

 

n,k = map(int,input().split())
a = list(range(1,n+1)) 
b= []
c = 0

for i in range(n):
    c+=(k-1)
    if c >= len(a):
        c %= len(a)
    b.append(str(a[c]))
    a.remove(a[c])

print("<",', '.join(b),">",sep='')

아까 언급한 %사용한 풀이 찾았다. 확실히 어색한 것이.. 내 사고방식이랑 조금 다르다. 이해하고 소화해보자 그래도.

( 이 분 근데.. 배열이나 변수 이름을 a,b,c로 지으셔서 짧은 코드인데도 헷갈린다. )