본문 바로가기

개발일지/TIL

TIL 23-05-31 백준 - 기타줄

1. 백준 - 기타줄 

 문제점

 시도해 본 것들

최솟값 구하기 

N, M = map(int, input().split())
min_package = 1000
min_single = 1000
for _ in range(M):
    package, single = map(int, input().split())
    min_package = min(min_package, package)
    min_single = min(min_single, single)

주어지는 수의 범위가 최대 1000으로 제시되었으므로 초기 값을 1000으로 시작하면 min으로 걸러낼 수 있다. 

 

정답 출력하기 

I, J = divmod(N, 6)
# 개별 단가가 더 싼경우
if min_package / 6 > min_single:
    print(N * min_single)
#  패키지가 개별 단가로 사는 것보다 싼 경우
elif min_package < min_single * J:
    print((I + 1) * min_package)
# 패키지 + 개별 단가인 경우
else:
    print(I * min_package + J * min_single)

I와 J를 통해서 패키지와 낱개로 구매하는 경우를 만들어내고 조건문을 통해서

1. 낱개가 패키지보다 싼 경우

2. 필요한 수 만큼 낱개로 구매하는 것보다 패키지를 구매하는 게 싼 경우 

3. 패키지와 낱개를 섞어서 구매하는 경우 

를 통해서 각각의 조건에 다른 경우의 수 출력하기 

 

최솟값 찾기 리팩토링

N, M = map(int, input().split())
min_package = []
min_single = []
for _ in range(M):
    package, single = map(int, input().split())
    min_package.append(package)
    min_single.append(single)

min_package = min(min_package)
min_single = min(min_single)

초기 값을 지정하지 않고 주어진 수 중에서 가장 작은 수를 구할 수 있도록 변경

하지만 코드의 길이도 길어지고 변수도 추가로 선언해야하며 무엇보다 실행시간이 느려졌다. 

 

결과값 출력 리팩토링

print(min(N * min_single, (I + 1) * min_package, I * min_package + J * min_single))

문제 자체가 가장 적은 금액을 지불하는 경우를 찾는 것으로 이것에도 min을 적용하면 최적의 경우를 찾을 수 있다. 

 해결 방법

N, M = map(int, input().split())
min_package = 1000
min_single = 1000
for _ in range(M):
    package, single = map(int, input().split())
    min_package = min(min_package, package)
    min_single = min(min_single, single)

I, J = divmod(N, 6)

print(min(N * min_single, (I + 1) * min_package, I * min_package + J * min_single))

 

 알게 된 점

문제를 틀리고 반례를 찾는 과정도 성장이 되지만, 가능하면 바로 제출하기 전 한 번 코드를 돌아보며 이 코드가 걸러내지 못하는 예외가 생기는지 생각하는 시간이 필요할 것 같다.