[Python] 백준 22234 가희와 은행

2021. 10. 28. 21:50·CS/알고리즘 & 문제풀이

문제 링크 : 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 방식으로 확인하거나, 이번 해결 코드처럼 리스트로 만들어 스택처럼 확인하면 된다.

'CS > 알고리즘 & 문제풀이' 카테고리의 다른 글

[Python] 백준 23259 Celebrity  (0) 2021.10.31
[Python] 백준 23257 비트코인은 신이고 나는 무적이다  (0) 2021.10.30
[Python] 백준 16888 루트 게임  (0) 2021.10.28
[Python] 백준 3109 빵집  (0) 2021.10.28
[Python] 백준 1461 도서관  (0) 2021.10.27
'CS/알고리즘 & 문제풀이' 카테고리의 다른 글
  • [Python] 백준 23259 Celebrity
  • [Python] 백준 23257 비트코인은 신이고 나는 무적이다
  • [Python] 백준 16888 루트 게임
  • [Python] 백준 3109 빵집
mintropy
mintropy
민트로피의 하루하루 오늘보다 더 나은 내일
  • mintropy
    민트로피의 민트초코
    mintropy
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 생각 정리
        • 코딩테스트
        • SSAFY
      • 디지털 노트
        • Obsidian.md
        • Notion
      • CS
        • 알고리즘 & 문제풀이
        • AI
        • DB
        • 디자인패턴
      • Projects
      • Python
        • Python Web Framework
      • JavaScript
        • React.js
      • Docker
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    django
    project_zero
    bfs
    게임이론
    line
    web framework
    파이썬
    브루트포스
    알고리즘
    SSAFY
    프로그래머스
    Combinatorics
    그리디
    DRF
    카카오
    trie
    조건분기
    프로젝트
    fastapi
    코딩테스트
    회고
    markdown
    pydantic
    dfs
    DP
    ps
    union-find
    Python
    구현
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
mintropy
[Python] 백준 22234 가희와 은행
상단으로

티스토리툴바