코딩테스트[파이썬]/알고리즘 문제풀이 입문

[스택 & 큐] -응급실

softmoca__ 2024. 2. 9. 19:34
목차

응급실

 

 

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다.

하지만 위험도가 높은 환자는 빨리 응급조 치를 의사가 해야 합니다.

이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로
다시 넣습니다.

그렇지 않으면 진료를 받습니다.  현재 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

 

 

  

나의 코드

from collections import deque

n,m=map(int,input().split())
arr=list(input().split())
cnt=0
dq=deque()

for x,y in enumerate(arr):
    dq.append([x,int(y)])

while True:
    M=0
    for i in range(len(dq)):
        if M<dq[i][1]:
            M=dq[i][1]
    
    if dq[0][1]==M:
        print(dq,M,cnt)
        if dq[0][0]==m:
            print(cnt+1)
            break
        dq.popleft()
        cnt+=1
        
    elif dq[0][1] !=M:
        dq.append(dq.popleft())

전형적인 큐를 사용하는 문제며 대기하고 있는 사람들의 인덱스를 참조해야하므로 eunmerate로 인덱스와 함께 dq에 넣는다.

while 문을 통해 매번 해당 큐의 최대 위험도를 찾고

큐를 순회하며 최대 위험도를 가진 사람은 그대로 popLeft

아닌 사람은 append(popleft)를 하며

최대 위험도를 가졌으며 인덱스가 입력된 m인 경우에는 출력 !

 

 

정답코드

import sys
from collections import deque
sys.stdin=open("input.txt", "r")
n, m=map(int, input().split())
Q=[(pos, val) for pos, val in enumerate(list(map(int, input().split())))]
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

 

리스트 컴프리헨션과 eumerate 입력값을 바로 인덱스와 함께 저장 하였다.

또한 any를 사용해서 최대값을 구했다.

 

 

전체적으로 파이썬 문법을 잘 사용해서 코드가 상당히 짧다..!
(너무 파이썬 문법을 사용해서 뭔가 개인적으로는 안끌리는 코드이당..)