• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

문제 예시 2 질문

23.12.22 10:43 작성 조회수 78

0

안녕하세요?

문제 예시 2의

입력 예제

6 0

60 60 90 60 60 60

에서 왜 답이 5인지 잘 이해가 안 갑니다!

문제에는 대기목록에 자기보다 위험도가 높은 환자가 없으면 자기가 진료를 받는 구조라고 하셨는데,

그러면 위의 예시에서 0 번째 환자가 진료를 받을 때는

당연히 2번째 아닌가 싶어서요

제 코드로는 두 번째, 다섯 번째 케이스에서 오답이 나오는데요


문제 설명에서 중복된 값이 있을 때 설명이 좀 이해가 잘 안 와 닿습니다.

from collections import deque
import sys
# sys.stdin = open('input.txt','r')

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

p = list(map(int, input().split()))

queue = deque(p)
done = 0
target = queue[m]
res = 0
while queue:
    maxx = max(queue)
    a = queue.popleft()
    if a < maxx:
        queue.append(a)
    else:    
        done += 1        
        if a == target:
            res = done
            print(res)
            break




답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.24

안녕하세요, 인프런 AI 인턴입니다.

thehrto12님, 문제 예시가 이해되지 않는 부분에 대해 혼동이 되셨군요. 이 문제는 환자들이 대기목록에 있고, 각자의 위험도에 따라 진료를 받게 되는 상황입니다. 주어진 입력 예제에서 6 0은 대기목록의 환자가 6명이고, 질문자님이 관심 있는 환자가 0번째에 위치한다는 의미입니다. 60 60 90 60 60 60은 각 환자의 위험도를 나타냅니다.

문제 설명에 따르면, 현재 환자보다 위험도가 높은 환자가 있다면, 그 환자는 대기목록의 맨 뒤로 이동합니다. 만약 대기목록에 자신보다 위험도가 높은 환자가 없다면, 현재 환자가 진료를 받습니다.

그래서 0번 환자가 진료를 받기 위해서는 자신보다 위험도가 높거나 같은 환자들이 먼저 진료를 받거나 대기열에서 제외될 때까지 기다려야 합니다. 주어진 예시에서 90은 가장 높은 위험도이고, 0번 환자보다 먼저 진료를 받게 됩니다. 그 후 남은 환자들의 위험도가 모두 60으로 동일하므로 처음에 0번 위치했던 환자가 진료를 받을 차례가 됩니다.

질문하신 코드에서 자신의 차례가 될 때까지의 카운트를 잘못 계산하신 것 같아요. 같은 위험도를 가진 환자가 여러 명일 때, 진료를 받은 후 대기목록에서 해당 위험도를 제거하는 로직에 문제가 있을 수 있습니다. 본래 문제에서 원하는 로직은, 원하는 환자의 순번이 정확히 언제인지를 찾아내야 한다는 점인데요, 이를 위해선 각 환자의 원래 순서도 함께 고려하여 queue에 넣어 처리해야 할 것 같습니다.

튜터링이나 문의하기를 통해서 더 자세한 도움을 받으시는 것도 좋은 방법입니다. 혹시 추가적으로 궁금한 사항이 있으시면 언제든지 문의해주세요.

감사합니다.