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))
알게 된 점
문제를 틀리고 반례를 찾는 과정도 성장이 되지만, 가능하면 바로 제출하기 전 한 번 코드를 돌아보며 이 코드가 걸러내지 못하는 예외가 생기는지 생각하는 시간이 필요할 것 같다.
'개발일지 > TIL' 카테고리의 다른 글
TIL 23-06-02 Linux vi 편집기 명령어 (0) | 2023.06.02 |
---|---|
TIL 23-06-01 git rebase drop 해보기 (0) | 2023.06.01 |
TIL 23-05-30 백준 - 폴리오미노 (0) | 2023.05.30 |
TIL 23-05-29 머신러닝 팀 프로젝트 - KPT 회고 (0) | 2023.05.29 |
TIL 23-05-27 머신러닝 팀 프로젝트 - annotate() (0) | 2023.05.27 |