[Algorithm] 응급실 (큐) (Feat. any(), all(), enumerate())

myeonji·2022년 2월 7일
0

Algorithm

목록 보기
37/89

> any 함수

인자로 받은 반복 가능한 자료형(iterable)중 단 하나라도 참이 있으면 참을 반환

  • 반복 가능한 자료형: 리스트, 튜플, 집합, 딕셔너리, 문자열 ...(for문에서 사용 가능한 것들)

> all 함수

인자로 받은 반복 가능한 자료형(iterable)의 모든 요소가 참이면 참을 반환

> enumerate 함수

순서와 값을 전달하는 기능, 인덱스를 함께 출력

메디컬 병원 응급실에는 의사가 한 명밖에 없습니다. 응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다. 이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다. 즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다. 현재 N명의 환자가 대기목록에 있습니다. N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.
대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.

<내 코드>

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

while 1:
    a = queue.popleft()
    print(a)

    for i in range(len(queue)):
        if queue[i] > a:
            queue.append(a)
            break
    else:
        cnt += 1
        if a == queue[i]:
            print(cnt)
            break

m번째 환자는 몇 번째에 진료를 받는지 구하는 부분에서 틀렸다.
만약, m=0이라고 할 때 뒤로 append되면 m은 마지막 인덱스 번호가 된다.
이걸 어떻게 표현해야 할지 고민이 됐다.
위의 코드에서는 if a == queue[i]: 이라고 조건을 썼는데 이것은 잘못된 조건이다. 위험도가 다 다르다면 모르겠지만, 위험도가 같을 때 이 조건은 틀리다.

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

이 문장은 받아오는 값 list(map(int, input().split())) = [60, 50, 70] 이라고 한다면 enumerate를 통해 인덱스와 함께 출력할 수 있다. 그러면 Q는 [(0, 60), (1, 50), (2, 70)] 이 된다.
인덱스를 같이 출력하는 이유는 m번째를 표시하기 위해서 이다.

<정답>

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):  # 뒤에 위험도가 높은 사람이 한 명이라도 있으면 true
        Q.append(cur)
    else:
        cnt += 1
        if cur[0] == m:
            break
print(cnt)

any함수를 사용해서 Q에서 꺼낸 위험도와 비교해서 하나라도 크다면 true가 된다.
뒤로 append 될 때도 cur 자체가 가기 때문에 (인덱스, 위험도) 형태로 Q에 저장된다. 따라서 Q의 순서가 계속 바뀐다고 하더라도 m번째를 알 수 있다.

0개의 댓글