[백준] 1049번 기타줄 ★★

거북이·2023년 1월 13일
0

백준[실버4]

목록 보기
35/91
post-thumbnail

💡문제접근

  • 끊어진 기타줄을 사기 위해 필요한 액수의 최솟값을 구하는 문제다. 이 때, 헷갈리면 안되는 점은 6줄 패키지만 살 수도 있고 낱개로 여러 줄을 살 수도 있지만 패키지와 낱개를 섞어서 살 수도 있다는 점이다.
  • 패키지의 가격을 기준으로 오름차순 정렬한 리스트 하나를 만들어주고 낱개의 가격을 기준으로 오름차순 정렬한 리스트 하나를 만들어 적어도 N개를 사기 위한 경우를 나누어 리스트에 저장한 다음 리스트의 최솟값을 구하는 방식으로 코드를 작성했다.

💡코드(메모리 : 30616KB, 시간 : 36ms)

N, M = map(int, input().split())
li = []
for _ in range(M):
    package_price, single_price = map(int, input().split())
    li.append([package_price, single_price])

package_li = sorted(li, key = lambda x : x[0])
single_li = sorted(li, key = lambda x : x[1])

result = []
# 만약 N이 6으로 나누어 떨어진다면?
if N % 6 == 0:
    # 몫만큼 패키지를 사는 가격보다 낱개를 N개만큼 사는 가격이 저렴할 때
    if package_li[0][0] * (N // 6) > single_li[0][1] * N:
        result.append(single_li[0][1] * N)
    # 몫만큼 패키지를 사는 가격이 낱개를 N개만큼 사는 가격보다 저렴할 때
    else:
        result.append(package_li[0][0] * (N // 6))
# 만약 N이 6으로 나누어 떨어지지 않는다면?
else:
	# ex. N = 5인 경우 1개 패키지를 사야하므로 몫에 1을 더한다.
    if package_li[0][0] * ((N // 6) + 1) > single_li[0][1] * N:
        result.append(single_li[0][1] * N)
    else:
        result.append(package_li[0][0] * ((N // 6) + 1))
    # 패키지와 낱개를 섞어 사는 경우를 마지막에 따로 저장한다.
    result.append(package_li[0][0] * (N // 6) + single_li[0][1] * (N % 6))
print(min(result))

💡소요시간 : 51m

0개의 댓글