백준 11866 - 요세푸스 문제(python)

연수·2024년 1월 5일

코딩테스트

목록 보기
4/10

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

처음 실패한 코드

num = input().strip().split()

from collections import deque 

num_list = deque(range(1, int(num[0])+1))

p_list = []

i = 1

while len(num_list) >= int(num[1]):
    if i != int(num[1]):
        num_list.append(num_list.popleft())
        i += 1


    else:
        p_list.append(num_list.popleft())
        i =1

# 최종적으로 남은 리스트 최종 리스트에 추가 
p_list += num_list 


result = ', '.join(map(str,p_list))

print(f'<{result}>')

결과적으로 보면 분명 테스트 정답과 동일하게 출력이 되지만 제출 결과는 '틀렸습니다'
너무 주먹구구식으로 끼워맞추듯이 코드를 작성한게 문제였던 것 같다.
최종적으로 남은 리스트를 최종 리스트에 추가한다는 등 또 한번의 일을 처리하는 코드가 있어 전체적으로 간결하지 못한 코드가 되었다.

최종 코드

⏳ 시간 - 88ms
💽 메모리 - 34000KB

from collections import deque
n, k = map(int, input().split())

circle = deque(range(1, n+1))

result = []

while circle:
    for _ in range(k-1):
        circle.append(circle.popleft())

    result.append(circle.popleft())

result = ', '.join(map(str, result))
print(f'<{result}>')
  • 입력 데이터를 각 변수로 바로 할당
    ➡️ 이전 코드에선 입력 받고 나누고 int로 변경하고를 별도로 진행했다면 한번에 처리하는 코드를 통해 변수에 바로 할당

  • 하나의 반복문으로 문제 해결
    ➡️ 이전 코드는 1차적으로 popleft()를 통해 값을 추출하고, 저장한 뒤 2차적으로 최종 리스트를 합치는 등 2단계로 진행했다면 최종 코드는 반복문 내에서 데이터가 모두 사라질 때까지 순환하며 리스트에 저장하였다.
    ➡️ 가능하다면 추가 단계 없이 하나의 단계에서 모든걸 처리하는 코드 작성이 중요

profile
하고 싶은건 다 하자 👻

0개의 댓글