프로그래밍 이야기/파이썬 코딩 테스트 스터디
파이썬 코딩테스트 스터디 4주차 #2 - 요세푸스 문제
hoony926
2024. 7. 9. 22:23
N명의 사람이 원 형태로 서있다.
각 사람은 1부터 N까지 번호표를 갖고 있다.
그리고 임의의 숫자 K가 주어졌을 때 다음과 같이 사람을 제거
- 1번 번호표를 가진 사람을 기준으로 K번째 사람 제거
- 없앤 사람 다음 사람 기준으로 다시 K번째 사람 제거
N과 K가 주어질 때 마지막에 살아있ㄴ는 사람의 번호를 반환하는 solution() 구현
- 제약 조건
- N과 K는 1이상 1000이하의 자연수
입출력 예
N | K | return |
5 | 2 | 3 |
그림 설명이 아주 자세히 되어있다.
■ 리스트로 설명
5 | 4 | 3 | 2 | 1 |
이렇게 데이터가 있을 경우,
step 1 . 제일우측부터 k-1번째 데이터까지. 여기선 k가 2이므로 k-1 = 1
즉 1을 제일 pop하고, 다시 제일 좌측에 push
1 | 5 | 4 | 3 | 2 |
step 2. 그리고 제일 우측의 데이터를 pop 여기선 2가 pop됨.
1 | 5 | 4 | 3 |
1 | 5 | 4 | 3 |
그리고 다시 step1~2시작
k가 2이므로 , k-1 = 1 까지의 데이터 pop&push
3 | 1 | 5 | 4 |
그리고 pop. 여기선 4가 pop됨.
3 | 1 | 5 |
3 | 1 | 5 |
이런식으로 하면
마지막으로 3이 남음 .
return 3
교재 192page에 나온 예시는 K = 3인 경우이나
이 부분 설명이 빠져있다.
■ 문제 분석하기
- 첫 번째 데이터부터 마지막 데이터까지 queue에 push
- 큐에서 k-1번째까지의 데이터를 각각 front에서 pop하고 rear에 push
- k번째 데이터를 팝하고 출력
- 과정 2~3을 queue에 원소가 없을 때까지 반복
다시 한번, K가 3인 경우다. N=5, K=3
■ 소스 코드
from collections import deque
def solution(N,K):
#1부터 N까지 번호 deque에 추가
queue = deque(range(1,N+1))
while(len(queue)>1): #deque에 원소가 1개 남을 때까지 반복
for _ in range(K-1) : # K-1까지 pop & push
queue.append(queue.popleft()) #그림이랑 반대로 소스에서는 왼쪽에서 빼서 오른쪽으로삽입
queue.popleft() # k번째 원소 제거
return queue[0]
♬ 자료 출처 - 책
코딩 테스트 합격자 되기 - 파이썬 편
이 포스팅의 모든 내용은 해당 책의 내용을 바탕으로 하고 있습니다.
감사합니다.