응급실(큐)

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다. 응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다. 이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.

 

• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.

 

즉, 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.

 

현재 N명의 환자가 대기목록에 있습니다.
N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.
대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.

 

▣ 입력설명

첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어집니다.
두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어집니다.
위험도는 값이 높을수록 더 위험하다는 뜻입니다. 같은 값의 위험도가 존재할 수 있습니다.

 

▣ 출력설명

M번째 환자는 몇 번째로 진료받는지 출력하세요.

 

▣ 입력예제 1

5 2
60 50 70 80 90

 

▣ 출력예제 1

3

 

▣ 입력예제 2

6 0
60 60 90 60 60 60

 

▣ 출력예제 2

5


풀이

enumerate를 통해 리스트를 인덱스를 포함하는 튜플로 만들어 m번째 환자를 찾을 수 있게 한다.

any를 활용하여 가장 작은 값을 찾는다.


코드

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

# 환자의 순서와 위험도 표시
Q = [(pos, val) for pos, val in enumerate (list(map(int, input().split())))]
# [(0,60), (1,50), (2,70), (3,80)] --> (index, value)
Q = deque(Q)
cnt = 0

while True:
    cur = Q.popleft()
    if any(cur[1] < x[1] for x in Q): # 현재위험도가 모든다른사람보다 하나라도 작다면
        Q.append(cur) # 뒤로 밀려난다.
    else: # 현재위험도가 가장 크다면
        cnt+=1
        if cur[0] == m:
            print(cnt)
            break

'⏰ 코딩테스트 > 자료구조 활용' 카테고리의 다른 글

단어 찾기(해쉬)  (0) 2021.10.22
교육과정 설계(큐)  (0) 2021.10.21
공주 구하기(큐)  (0) 2021.10.20
후위식 연산(스택)  (0) 2021.10.19
후위표기식 만들기(스택)  (0) 2021.10.18
복사했습니다!