백준 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))

교훈

문제에 무작정 달려들지 말고, 해결 방법이 보이더라도 조금더 다른 관점에서 생각해보는 습관을 기르자,,,

좋은 웹페이지 즐겨찾기