For Programmer
SWEA 1860 파이썬 문제풀이(진기의 최고급 붕어빵) 본문
728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LsaaqDzYDFAXc
이 문제도 간단한 구현문제이다. 단, 시간을 최대한 줄이기위해 반복문 탈출 조건을 생각해야했다. 내가 생각한 탈출 조건은 반복문을 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
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 2003번 파이썬 문제풀이(수들의 합 2) (0) | 2022.02.13 |
---|---|
SWEA 4615 파이썬 문제풀이(재미있는 오셀로 게임) (0) | 2022.02.12 |
SWEA 4613 파이썬 문제풀이(러시아 국기 같은 깃발) (0) | 2022.02.11 |
SWEA 1267 파이썬 문제풀이(작업순서) (0) | 2022.02.11 |
SWEA 1216 파이썬 문제풀이(회문2) (0) | 2022.02.10 |
Comments