[SWEA] 1860 : 진기의 최고급 붕어빵 - Python

Chooooo·2023년 11월 16일
0

알고리즘/백준

목록 보기
125/182

문제 : 진기의 최고급 붕어빵

진기는 붕어빵 가게를 운영하고 있다.

진기가 파는 붕어빵은 그냥 붕어빵이 아니라 겉은 바삭! 속은 말랑! 한입 물면 팥 앙금이 주르륵 흘러 입안에서 춤을 추며,

절로 어릴 적 호호 불며 먹었던 뜨거운 붕어빵의 추억이 떠올라 눈물이 나오게 되는 최고급 붕어빵이다.

진기는 이런 붕어빵을 보통 사람들에게는 팔지 않는다.

그는 무조건 예약제로만 손님을 받으며, 예약을 하려는 손님들은 진기의 까다로운 자격 검증에서 합격해야만 붕어빵을 맛 볼 자격을 얻는다.

그래서 오늘은 N명의 사람이 자격을 얻었다.

진기는 0초부터 붕어빵을 만들기 시작하며, M초의 시간을 들이면 K개의 붕어빵을 만들 수 있다.

서빙은 진기가 하는 것이 아니기 때문에, 붕어빵이 완성되면 어떤 시간 지연도 없이 다음 붕어빵 만들기를 시작할 수 있다.

0초 이후에 손님들이 언제 도착하는지 주어지면, 모든 손님들에게 기다리는 시간없이 붕어빵을 제공할 수 있는지 판별하는 프로그램을 작성하라.

[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 세 자연수 N, M, K(1 ≤ N, M, K ≤ 100)가 공백으로 구분되어 주어진다.

두 번째 줄에는 N개의 정수가 공백으로 구분되어 주어지며,

각 정수는 각 사람이 언제 도착하는지를 초 단위로 나타낸다. 각 수는 0이상 11,111이하이다.

[출력]

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

모든 손님에 대해 기다리는 시간이 없이 붕어빵을 제공할 수 있으면 “Possible”을, 아니라면 “Impossible”을 출력한다.

import sys
sys.stdin = open("input.txt", "rt")
from collections import deque

T = int(input())
for t in range(1,T+1):
    n,m,k = map(int, input().split())
    data = list(map(int, input().split())) # n명의 사람들이 도착하는 시간
    data.sort() # 오름차순 정렬
    cnt = 0
    e = data[-1] # 가장 마지막에 도착하는 사람의 시간
    dq = deque(data)
    for i in range(e+1):
        if i != 0 and i % m == 0:
            cnt += k
        if dq[0] == i: # 현재 초에 방문
            if cnt > 0:
                cnt -= 1
                dq.popleft() # 해당 사람 통과
            else:
                print(f"#{t} Impossible")
                break
    else:
        print(f"#{t} Possible")

코멘트

나는 그냥 있는 그대로 풀었는데 수학적으로 접근해도 됐다.

손님 1명한테는 무조건 1개의 붕어빵만을 판매하기 때문에 하나씩 카운트 해주면 된다.
0초부터 M초마다 k개를 만든다.

그렇기에 x초일 때 몇개의 붕어빵이 있을지를 미리 계산하는 것이다.
그리고 x초 까지 몇명이 존재하는지를 빼면 붕어빵의 재고를 알 수 있다.

-> 일반적으로 x초까지 만들어진 붕어빵 개수는 (x//m) * k이다.

  • 왜냐하면 단위시간 M으로 나눈 몫만큼 만들 수 있고 그때마다 k개를 만들기 때문.
  • 예시를 들어서 생각하면 편하다.

인당 1개씩 구매하기 때문에 인덱스 + 1만큼 빼주면 된다.

import sys
sys.stdin = open("input.txt", "rt")
from collections import deque

T = int(input())
for t in range(1,T+1):
    n,m,k = map(int, input().split())
    data = list(map(int, input().split())) # n명의 사람들이 도착하는 시간
    data.sort() # 오름차순 정렬

    flag = True
    for i in range(n):
        # x초까지 만들어진 붕어빵 개수 : x // m * k
        cnt = (data[i] // m) * k - (i+1)  # data[i]까지 만들어진 붕어 개수. i+1은 현재 시간까지 존재하는 사람 수

        if cnt < 0:
            flag = False
            break
    else:
        print(f"#{t} Impossible")
    if flag == False:
        print(f"#{t} Possible")


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

0개의 댓글