Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.
끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.
이 문제는 패키지로 샀을 때 / 낱개로 샀을 때 무엇이 더 쌀 지를 계산해서 가장 싸게 살 수 있는 금액을
출력하는 문제이다.
패키지로만 산다고 무조건 싼 것이 아니라, 패키지가 6개 단위로 구성되어 있는데 이 구성 요소들이
개별적으로 살 때보다 싼 지를 확인하고 더 쌀 때만 패키지를 사는 것이 유리하다.
N, M = map(int,input().split())
ans = []
package = []
single = []
for i in range(M):
packs, singles = map(int,input().split())
package.append(packs)
single.append(singles)
minsig = min(single)
minpac = min(package)
if (minpac / 6) > minsig: #single이 더 쌈 -> single로만 사
ans.append(minsig * N)
else: #패키지가 더 쌈
sing = N % 6
pack = N // 6
if ((sing * minsig) + (pack * minpac)) > ((pack + 1) * minpac):
#패키지 하나 더하는 게 더 쌀 수도 있음
ans.append(((pack + 1) * minpac))
else:
ans.append((sing * minsig) + (pack * minpac))
print(min(ans))
경우의 수는 다음과 같다.
패키지를 사는 것이 유리할 때
-> 최대한 많은 패키지를 사고 개별적으로 사는 것을 줄임
패키지를 살 필요가 없을 때
-> 가장 싼 개별적인 것으로 전체 개수만큼 산다.
또한, 여러 개의 브랜드 중에서도 가장 싼 것을 사는 것이 중요하기 때문에
입력 받은 패키지 값과 개별 값들 중에서도 가장 최솟값으로 사면 된다.
나의 경우 min() 을 이용하였지만 .sort() 한다음 해당 배열의 0번째 값으로 가져와도 될 거 같다
첫 번째 경우의 수에서는 최대한 많은 패키지를 사는 것이 유리하기 때문에 6개 묶음으로 나눈다.
그리고, 묶음을 하나 더 사는 것이 더 싼 경우에는 해당 가격이 정답이 될 수 있도록 하였다.
처음에는 나는 무조건 패키지가 더 쌀 것이라고 생각하고 프로그램을 짰었다.
예제에서는 다 맞았었는데 코드 제출을 하니 틀렸습니다 라고 나와서 꽤 당황했었다.
질문게시판을 참고해보니 패키지가 꼭 싼 것만은 아니었다고 한다.. ^=^