본문 바로가기

알고리즘 삽질장

[인프런] 응급실

반응형


문제설명

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

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

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

입력조건

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

출력조건

  • M번째 환자는 몇 번째로 진료받는지 출력해라.

사고과정

  • 큐를 활용해야 한다. 자칫하면 내림차순으로 정렬해서 번째수 체크하면 되지 않나? 하지만 만약 동일한 위험도가 존재한다면 앞쪽에 있는 환자부터 진료해야 한다. 그래서 큐에 위험도와 몇 번째 환자인지 튜플 형태로 집어넣어서 처리해준다.
  • 매번 가장 앞에 있는 환자가 나머지 환자들보다 위험도가 가장 높은지 체크해야 하는데 나는 이것을 함수로 따로 구현했다. 그런데 강의 풀이는 any 조건을 활용했다. any 조건은 하나만 True여도 True를 반환한다. 이 any 조건을 사용하면 풀이가 매우 간결해진다.. 매우 인상적이었음!

풀이

- 나의 풀이

from collections import deque

def find_max(patient, queue):
    for i in range(len(queue)):
        if patient < queue[i][1]:
            return True  # 더 높은 위험도 환자 있음
    return False
    
n, m = map(int, input().split())
arr = list(map(int, input().split()))
queue = deque([])
for idx, a in enumerate(arr):
    queue.append((idx, a)) # 번째, 위험도

cnt = 0
while queue:
    idx, patient = queue.popleft()
    if find_max(patient, queue):
        queue.append((idx, patient))
    else:
        cnt += 1
        if idx == m:
            print(cnt)
            break

- 강의 풀이(권장)

from collections import deque

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:
            break
print(cnt)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 단어 찾기  (0) 2021.11.17
[인프런] 교육과정 설계  (0) 2021.11.17
[인프런] 공주 구하기  (0) 2021.11.17
[인프런] 가장 큰 수  (0) 2021.11.16
[인프런] 역수열  (0) 2021.11.16