오도원입니다.

건강과 행복을 위하여

컴퓨터공학/알고리즘

[백준] 1049. 기타줄

오도원공육사 2020. 5. 9. 17:25
반응형

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

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주어진다. 가격은 0보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

1. 문제

N개의 줄을 교체하려고 한다. 6줄 패키지를 사거나 1개 또는 그 이상의 줄을 낱개로 살 수 있다. 이때 M개의 브랜드에 따른 패키지가격과 낱개 가격이 주어질 때 기타줄을 교체하는데 최소금액을 구하라.

 

2. 접근

1. M개의 브랜드를 모두 포함하여 최소 패키지 금액과 최소 낱개 금액을 구한다.

2. 패키지와 낱개를 이용하여 구매할 때의 경우의 수를 나눈다.

  • 1.전부 다 낱개로 사는게 저렴한 경우
    • => if 낱개 * 6 < 패키지
  • 2. 전부 다 패키지로 사는게 저렴할 경우
    • 6개씩 묶고 나서 남은 개수도 패키지로 사는게 저렴한 경우 => if 낱개 * (n%6) > 패키지
  • 3. 6개씩은 패키지로 사고, 나머지는 낱개로 사는 경우
    • => 패키지 * (n // 6) + 낱개 * (n % 6)

3. 소스코드

n, b = map(int, input().split())
brand = [list(map(int, input().split())) for _ in range(b)]

def m(brand):
    min_p, min_u = 1001, 1001
    for cost in brand:
        if min_p > cost[0]:
            min_p = cost[0]
        if min_u > cost[1]:
            min_u = cost[1]
    return min_p, min_u # 최소 패키지 금액과 최소 낱개 금액을 구한다.

def m2(min_p, min_u, n):
    if min_u * 6 < min_p: # 6개 낱개로 사는게 패키지로 사는 것보다 이득
        return min_u * n
    if min_u * (n%6) > min_p: # 나머지도 패키지로 사는게 이득
        return min_p * (n//6 + 1)
    return min_p * (n//6) + min_u * (n%6) # 6개씩은 패키지로 구매하고 나머지는 낱개로 구매

min_p, min_u = m(brand)
print(m2(min_p, min_u, n))
반응형

'컴퓨터공학 > 알고리즘' 카테고리의 다른 글

Python Algorithm. 1주차 스터디 계획  (0) 2020.05.11
[백준] 1449. 수리공 항승  (0) 2020.05.09
[백준] 1120. 문자열  (0) 2020.05.09
[백준] 10610. 30  (0) 2020.05.09
[백준] 2217. 로프  (0) 2020.05.09