[파이썬 알고리즘 문제풀이] - Section5 / 자료구조 활용(큐) -6

Chooooo·2023년 2월 1일
0

🎃 응급실

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다. 이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.
즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.현재 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

import sys
from collections import deque
# sys.stdin = open("input.text", "rt")
# input = sys.stdin.readline

N, M = map(int, input().split())
data = [(pos, val) for pos, val in enumerate(list(map(int, input().split())))]


dq = deque(data)

res = 0
while True:
    temp = dq.popleft()   # temp[0] 은 pos, temp[1] 은 val 튜플로 받아왔잖아 !@!
    if all(temp[1] > x[1] for x in dq):  #any all 적절히 활용할 수 있어야함.
        res += 1
        if temp[0] == M:
            break
    else:
        dq.append(temp)

print(res)          

🎃 코멘트
이 문제는 중복이 문제였다. 같은 위험도일 떄 M번째 환자는 과연 누구인지 알 수 있었어야 했다. 즉 처음부터 인덱스를 같이 저장해서 누가 누구인지 알 수 있게 데이터를 저장시켰어야 했다. → 튜플 형태로 저장해줬으면 됐음

dq = [(pos, val) for pos, val in enumerate(list(map(int ,input().split())))] 이런 식으로 데이터 저장 가능한거 이해하고 넘어가기.

이렇게 입력부터 인덱스를 같이 저장해줬다면 중복되어도 상관없었다.
이렇게 입력받는 것도 생각하기 !!!

any, all 활용 그리고 그 안에서의 반복문 조건 적절히 생각.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글