[python] 백준 1049번 - 기타줄

희희구리·2023년 4월 19일
0

백준

목록 보기
4/21
post-thumbnail
post-custom-banner

문제

Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.

끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.

링크 참조

https://www.acmicpc.net/problem/1049

풀이 설명

이 문제는 패키지로 샀을 때 / 낱개로 샀을 때 무엇이 더 쌀 지를 계산해서 가장 싸게 살 수 있는 금액을
출력하는 문제이다.
패키지로만 산다고 무조건 싼 것이 아니라, 패키지가 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))

경우의 수는 다음과 같다.

  1. 패키지를 사는 것이 유리할 때
    -> 최대한 많은 패키지를 사고 개별적으로 사는 것을 줄임

  2. 패키지를 살 필요가 없을 때
    -> 가장 싼 개별적인 것으로 전체 개수만큼 산다.

또한, 여러 개의 브랜드 중에서도 가장 싼 것을 사는 것이 중요하기 때문에
입력 받은 패키지 값과 개별 값들 중에서도 가장 최솟값으로 사면 된다.
나의 경우 min() 을 이용하였지만 .sort() 한다음 해당 배열의 0번째 값으로 가져와도 될 거 같다

첫 번째 경우의 수에서는 최대한 많은 패키지를 사는 것이 유리하기 때문에 6개 묶음으로 나눈다.
그리고, 묶음을 하나 더 사는 것이 더 싼 경우에는 해당 가격이 정답이 될 수 있도록 하였다.

💌

후기

처음에는 나는 무조건 패키지가 더 쌀 것이라고 생각하고 프로그램을 짰었다.
예제에서는 다 맞았었는데 코드 제출을 하니 틀렸습니다 라고 나와서 꽤 당황했었다.
질문게시판을 참고해보니 패키지가 꼭 싼 것만은 아니었다고 한다.. ^=^

profile
beginner :>
post-custom-banner

0개의 댓글