백준 1049 : 기타줄
끊어진 기타줄의 개수 N, 기타줄 브랜드 M개일때, 기타줄을 N개 사기 위해 필요한 돈의 최솟값을 찾는 문제이다.
처음에는
if min_pack < min_one: ## 6개짜리 팩이 제일 싼 하나보다도 더 싼 경우에는 그냥 넘치더라도 팩으로만 사는게 이득
num_pack = n // 6
cost = (num_pack + 1) * min_pack
elif min_pack/6 == min_one: #팩으로 사는 한개의 가격과 가격이 같은 경우에는 젤싼거 * 6
cost = min_one * n
elif min_pack/6 > min_one: #팩으로 사는 한개의 가격이 하나의 가격보다 비싼 경우에는 다 개당으로 사는게 이득
cost = min_one * n
else: ## 그외의 경우들
if (n % 6) * min_one < min_pack: ## 나머지를 낱개로 사는 가격이 한 팩보다 더 싼경우에는
cost = (n // 6) * min_pack + (n % 6) * min_one
else: ##
num_pack = n // 6
cost = (num_pack + 1) * min_pack
6개 묶음짜리에서 가장 저렴한 묶음과, 낱개 중에서 제일 저렴한 제품만을 사용하면 되고, 처음에는 사고의 흐름대로 굉장히 무식하게 일일히 경우들을 찾아주려고 했다.
일일히 케이스를 나열하다가 관점을 전환하니 항상
1) 다 팩으로만 사거나
2) 다 낱개로 사거나
3) 팩으로 채우고, 낱개는 1개짜리로 채우거나
다음의 경우 중에서 최소값이 나오겠다는 생각을 했고,,,
복잡한 케이스 분류 없이 3개의 리스트에서 최솟값는 찾는 방식으로 문제를 해결했다...
# 끊어진 기타줄의 개수 N
# 기타줄 브랜드 M개
n, m = map(int, input().split())
# 각 브랜드의 패키지 가격(6개가 들어있는 패키지), 낱개의 가격의 input
pack = []
one = []
for i in range(m):
a,b = map(int, input().split())
pack.append(a)
one.append(b)
cost = 0
min_pack = min(pack)
min_one = min(one)
#크게 3가지 경우의 수가 있음 : 다 팩으로만 사거나 팩으로 사고, 다 낱개로 사거나, 팩으로 채우고, 낱개는 1개짜리로 채우거나
cost_list = []
cost_list.append((n // 6 + 1) * min_pack)
cost_list.append(min_one * n)
cost_list.append((n // 6) * min_pack + (n % 6) * min_one)
print(min(cost_list))
교훈
문제에 무작정 달려들지 말고, 해결 방법이 보이더라도 조금더 다른 관점에서 생각해보는 습관을 기르자,,,
Author And Source
이 문제에 관하여(백준 1049 : 기타줄), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eclat12450/백준-1049-기타줄저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)