본문 바로가기

Algorithm/Baekjoon BOJ

[백준][파이썬] 1049번 : 기타줄(코드, 해설, 풀이)

반응형

 

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

 

1049번: 기타줄

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

www.acmicpc.net

 


- 문제

 

첫째 줄에 총 구매해야 하는 기타줄의 수 N과 총 기타줄 브랜드 개수 M이 주어지고, 그 이후부터 M개의 줄에는 각 브랜드의 줄 6개 가격과 줄 1개 가격이 주어질 때 N개의 기타줄을 가장 싸게 구매하는 방법을 구하는 문제다.


- 해설

  생각을 조금만 해보면 아주 간단하게 해결할 수 있는 문제라고 생각한다. 가장 싸게 기타줄을 구매하면 되는 문제이니깐 낱개로 파는 물건들 중에서 가장 싼 브랜드랑 패키지로 판매하는 물건들 중에서 가장 싼 브랜드를 찾아낸 후 몇 가지 경우를 예상해보고 문제를 해결해보자. 

 

1. 가장 싼 낱개 가격이 1이고 가장 싼 패키지 가격이 7일 때

- 패키지는 결국 낱개가 6개 들어있는 경우니깐 낱개로 사는게 더 이득이라는 것을 알 수 있다. 그러므로 패키지 가격도 6으로 바꿔버린다.

 

2. 가장 싼 낱개 가격이 4이고 가장 싼 패키지 가격이 6일 때

- 낱개로 2개 이상 구매하면 패키지로 구매하는게 훨씬 이득이니깐 기타줄이 1개가 필요한 경우가 아니면 패키지로 구매하도록 한다.

 

3. 낱개 가격이 패키지 가격보다 비쌀때

- 무조건 패키지로 구매하도록 한다.

 

3번째는 너무 당연한 얘기니깐 빼고 1번째와 2번째를 구하는 방법을 생각해보자. 결국 N개의 기타줄을 사야하므로 N//6을 하면 총 몇개의 패키지를 구매해야 하는지 알 수 있다. N%6을 하면 마찬가지로 낱개로 기타줄을 몇개를 사야하는지 알 수 있다. 

 


- 풀이

import sys
N, M = map(int, sys.stdin.readline().split())
pack = []
one = []
for i in range(M):
    a = list(map(int, sys.stdin.readline().split()))
    pack.append(a[0])
    one.append(a[1])
pack.sort()
one.sort()
if one[0]*6 < pack[0]:
    pack[0] = one[0]*6
N_div = N % 6
N = N//6
if N_div * one[0] > pack[0]:
    print((N+1)*pack[0])
else:
    print(N*pack[0] + N_div*one[0])

  가독성이 좋아지도록 pack[0]이랑 one[0]이라고 하지 말고 cheapP와 cheapO처럼 변수로 저장하고 사용하는 것도 방법이다. 

반응형