panggin / gongbuhaja

백준 문제풀이 올리는 리포 :D
0 stars 0 forks source link

<해결> 파이썬python #11866 요세푸스 문제 0 #5

Open makie082 opened 1 year ago

makie082 commented 1 year ago

틀렸는데 왜 틀렸는지 진심 모르겠엄 ^^;;;; deque 사용하라던디 그거 모르고 걍 리스트로 풀었음


import sys
input = sys.stdin.readline

N,K = map(int, input().split())

ppl = [i for i in range(1,N+1)] # 사람들 수열
answer = []

for a in range(N): # 사람들이 다 없어질 때까지 해야하므로 사람 수만큼 반복하면 됨
    if len(ppl) < K:
        ppl = ppl+ppl

    #print("original ppl:",ppl)

    popN = ppl.pop(K-1)
    answer.append(popN) # 3번째 꺼 삭제하고 answer에 추가해주기
    #print("answer:",answer)

    if popN in ppl:
        ppl.remove(popN)

    #print("erased ppl:",ppl)

    for front in range(K-1): # 앞에 있는 거 두 개 지우고 뒤에 붙이기
        ppl.append(ppl.pop(0))

print("<", end="")
for i in range(len(answer)):
    if i == len(answer)-1:
        print(answer[i], end='')
    else:
        print(answer[i], end=", ")

print(">")

반례) 7 6 넣으면 안됨

원래 수열은 [7,1,2,3,4,7,1,2,3,4] 였는데 6번째 숫자인 7이 없어지면서 [1,2,3,4,1,2,3,4]가 된다. 7 다음의 수는 1이기 때문에 1부터 다시 시작해야하는데 앞에 5개가 삭제되어 뒤에 붙으면 [2,3,4,1,2,3,4,1]이 된다. 동일한 숫자가 있다면 삭제되어서 수열이 달라지는 과정을 생각하지 못함 ㅜ

makie082 commented 1 year ago

정답 버전....

import sys
input = sys.stdin.readline

N,K = map(int, input().split())

ppl = [i for i in range(1,N+1)] # 사람들 수열
answer = []

for a in range(N): # 사람들이 다 없어질 때까지 해야하므로 사람 수만큼 반복하면 됨
    for front in range(K-1): # 앞에 있는 거 두 개 지우고 뒤에 붙이기
        ppl.append(ppl.pop(0))
    answer.append(ppl.pop(0)) #answer에 붙여주기

print("<", end="")
for i in range(len(answer)):
    if i == len(answer)-1:
        print(answer[i], end='')
    else:
        print(answer[i], end=", ")
print(">")
makie082 commented 1 year ago

deque(양방향 queue) 이용한 정답..

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

N,K = map(int, input().split())

ppl = deque([i for i in range(1,N+1)]) # 사람들 수열을 덱으로
answer = []

for a in range(N): # 사람들이 다 없어질 때까지 해야하므로 사람 수만큼 반복하면 됨
    for front in range(K-1): # 앞에 있는 거 두 개 지우고 뒤에 붙이기
        ppl.append(ppl.popleft())
    answer.append(ppl.popleft())

print("<", end="")
for i in range(len(answer)):
    if i == len(answer)-1:
        print(answer[i], end='')
    else:
        print(answer[i], end=", ")
print(">")