본문 바로가기

Algorithm/Python

036 - 공주 구하기(큐 자료구조로 해결)

정보 왕국의 이웃 나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다.
정보 왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다. 정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다.
왕은 왕자들을 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다. 그리고 1번 왕자부터 N 번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다. 그리고 1번 왕자부터 시 계방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다. 한 왕자가 K(특정숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다. 그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다.
이렇게 해서 마지막까지 남은 왕자가 공주를 구하러 갈 수 있다.

 

 

 

예를 들어 총 8명의 왕자가 있고, 3을 외친 왕자가 제외된다고 하자. 처음에는 3번 왕자가 3 을 외쳐 제외된다. 이어 6, 1, 5, 2, 8, 4번 왕자가 차례대로 제외되고 마지막까지 남게 된 7 번 왕자에게 공주를 구하러갑니다.
N과 K가 주어질 때 공주를 구하러 갈 왕자의 번호를 출력하는 프로그램을 작성하시오.

 

입력설명
첫 줄에 자연수 N(5<=N<=1,000)과 K(2<=K<=9)가 주어진다.

 

출력설명
첫 줄에 마지막 남은 왕자의 번호를 출력합니다.

 

입력예제 1

8 3

 

출력예제 1

7

 

 

# 파이썬 답지 않은 코딩 예시. 동작은 하는데, C 언어처럼 코딩한 경우.

n, k = map(int, input().split())
a = [0]*n

cnt = 0
i = 0
while sum(a) < n:
    if i == n:
        i = 0
    if a[i] == 0:
        cnt += 1
        if cnt == k:
            cnt = 0
            a[i] = 1
    i += 1
print(i)

 

 

 

# deque를 사용하지 않은, 파이썬 스러운 예시
# deque를 사용해서 pop() 대신에 popleft()를 사용해도 좋다

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

res=list(range(1,n+1))

while len(res) > 1:
  for i in range(m):
    if i == (m-1):
      res.pop(0)
    else:
      res.append(res.pop(0))
print(*res)

 

 

 

# deque와 rotate를 조합해서 사용한 경우(pop,append 대신에 rotate를 사용한 경우)

from collections import deque
n, m = map(int, input().split())
res=list(range(1,n+1))
res=deque(res)

while len(res) > 1:
  res.rotate(1-m)
  x = res.popleft()
print(*res)

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

038 - 교육과정 설계  (0) 2023.08.22
037 - 응급실(리스트, 큐 자료구조)  (0) 2023.08.22
035 - 후위식 연산  (0) 2023.08.18
034 - 후위표기식 만들기  (0) 2023.08.16
033 - 쇠막대기  (0) 2023.08.16