본문 바로가기
CS/알고리즘 & 문제풀이

[Python] 백준 22234 가희와 은행

by mintropy 2021. 10. 28.

문제 링크 : https://www.acmicpc.net/problem/22234

 

22234번: 가희와 은행

가희는 창구가 하나인 은행을 운영하고 있습니다. 가희의 은행이 영업을 시작했을 때, 대기 줄에는 손님이 N명 있습니다. [그림 1] 카운터 직원과 N명의 손님 x번 손님에 대한 정보는 x번 손님의

www.acmicpc.net

1. 접근 방법

간단한 구현 문제인데, 출력을 어떻게 조정할지 많이 고민했다.

구현 과정은 각 손님의 남은 시간을 확인하고, 업무처리를 각각 상황에 맞게 시간을 사용하고, 사용한 시간만큼 출력할 리스트에 저장하면서 진행했다.

 

 

2. 풀이 코드

🖥python 코드

from collections import deque
import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())


N, T, W = MIIS()
# 처음 대기중 손님
guests = deque([tuple(MIIS()) for _ in range(N)])
M = int(input())
# 추가 들어올 손님
next_guests = sorted([tuple(MIIS()) for _ in range(M)], key=lambda x: -x[2])

# 지금 시간
time = 0
# 출력
output = []
while time < W:
    # 가장 앞에 있는 손님
    idx, left_time = guests.popleft()
    # 남아 있는 시간 비교
    # 더 많이 남아 있다면 T만큼만 하고 뒤로
    if left_time > T:
        # 시간 확인하여 출력
        next_time = time + T
        if next_time >= W:
            output += [idx] * (W - time)
        else:
            output += [idx] * T
        time = next_time
        # 다음 줄설수 잇는 손님 확인
        while next_guests:
            # 남은 손님이 있고, 출입 시간이 되었을 때
            if next_guests[-1][2] <= next_time:
                guests.append(next_guests[-1][:2])
                next_guests.pop()
            else:
                break
        # 줄 가장 뒤로
        guests.append((idx, left_time - T))
    # T와 같거나 적게 남아 있으면 퇴장
    else:
        # 시간 확인하여 출력
        next_time = time + left_time
        if next_time >= W:
            output += [idx] * (W - time)
        else:
            output += [idx] * left_time
        time = next_time
        # 다음 줄설수 잇는 손님 확인
        while next_guests:
            # 남은 손님이 있고, 출입 시간이 되었을 때
            if next_guests[-1][2] <= next_time:
                guests.append(next_guests[-1][:2])
                next_guests.pop()
            else:
                break
        # 은행 나가기

print(*output, sep='\n')

📕코드 해설

1. 가장 앞에 있는 손님을 확인한다.

2. 각 손님의 남은 시간과 한 번에 사용할 시간 T를 비교해서 사용한다.

3. 각 손님 별로 사용한 시간만큼 출력 리스트에 추가한다

4. 사용한 시간사이에 다른 손님이 들어오면 해당 손님들을 모두 추가하고,

5. 이전 손님을 가장 뒤에 추가하거나, 추가하지 않는다.

 

 

3. 생각 정리

처음에 추가할 손님도 deque로 선언 후, while next_guests로 확인하면서 진행했다.

예전에도 했던 실수인데, deque는 요소의 수에 따라 True/False가 바뀌지 않아서 고생했었는데, 이번에 또다시 실수했다.

이를 해결하기 위해서는 len(next_guests) > 0 방식으로 확인하거나, 이번 해결 코드처럼 리스트로 만들어 스택처럼 확인하면 된다.

댓글