For Programmer

SWEA 1860 파이썬 문제풀이(진기의 최고급 붕어빵) 본문

코팅테스트/백준 문제 모음

SWEA 1860 파이썬 문제풀이(진기의 최고급 붕어빵)

유지광이 2022. 2. 12. 22:52
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LsaaqDzYDFAXc 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


이 문제도 간단한 구현문제이다. 단, 시간을 최대한 줄이기위해 반복문 탈출 조건을 생각해야했다. 내가 생각한 탈출 조건은 반복문을 0초 부터~ 최대 도착시간까지 돌면서 남은 사람수를 계속 계산하는 것이다. 만약 남은사람보다 이미 현재 가지고있는 붕어빵이 더 많다면 굳이 뒤에 더 검사하지 말고 바로 탈출 하는 것이었다.

import sys

sys.stdin = open('input.txt', 'r')


def solution():
    rest_people = N  # 남은 사람수 저장
    current_amount = 0  # 현재 양을 저장
    for i in range(max(arrival) + 1):  # 도착하는 사람의 최대 시간까지 돈다.
        if i != 0 and i % M == 0:  # 만약 현재 시간이 0초가 아니면서 M초마다
            current_amount += K  # K를 만들어 낸다.
        if i in arrival:  # 만약 현재 시간에 도착하는 사람이 있다면
            current_count = arrival.count(i)  # 해당 시간에 도착한 사람수 계산
            rest_people -= current_count  # 남은 사람수를 계산하기위해 해당 시간에 도착한 사람수를 빼준다.
            current_amount -= current_count  # 그 사람 수 만큼 빼준다.
            if current_amount < 0:  # 만약 뺀 값이 음수라면
                print(f'#{order} Impossible')  # 붕어빵을 팔 수 없음을 출력
                return
            if current_amount >= rest_people:  # 만약 현재 양이 남은 사람보다 더많다면
                print(f'#{order} Possible')
                return


T = int(input())

for order in range(1, T + 1):
    # 사람수,만드는데 걸리는 시간,만들 수 있는 양
    N, M, K = map(int, input().split())
    arrival = list(map(int, input().split()))

    solution()  # 함수 실행

 

또한 어떤 분이 수학적으로 식을 한줄로 구현해서 푸는 코드가 있어서 공유하겠다. 이 풀이는 최소 시간으로 통과한다.

ret = []
TCs = int(input())
for T in range(1, TCs + 1):
    N, M, K = map(int, input().split())
    ppl = list(map(int, input().split()))
    ppl.sort()

    possible = True
    for i in range(N):
        if ppl[i] // M * K < i + 1:  # 해당 시간에 만들어진 붕어빵 보다 온 사람수가 더 많다면
            possible = False
            break

    ret.append(f'#{T} Possible\n' if possible else f'#{T} Impossible\n')

    print(''.join(ret))
728x90
Comments