본문 바로가기
Programming/BOJ

[C/C++] 백준 #1049 기타줄

by 작은별하나(A Little Star) 2019. 12. 28.

이 문제는 간단한 형태의 나눗셈과 적절한 곱 연산만 하면 풀 수 있는 문제입니다.  Silver IV 문제로 분류되어 있지만, 그보다는 난이도는 더 쉬워보입니다.  단지 정답률이 29.3%로 상당히 낮습니다.

purchase guitar strings

 

이 문제는 선입관이 있으면 실수할 수도 있다고 봅니다.  묶음상품의 단가가 개별상품의 가격보다 싸야할거라는 것과 묶음상품이 싼 곳이 개별상품 가격도 쌀거라는 선입관을 버리면 쉽게 풀 수 있습니다.

 

문제의 내용은 기타줄을 사는데, 필요한 기타줄의 갯수가 주어지고, 그 갯수에 맞추어서 기타줄 상점에서 파는 6개들이 묶음상품과 개별 상품을 적절하게 사서 가장 싼 가격에 필요한 기타줄을 사는 문제입니다.

 

다음은 이 문제의 링크입니다.

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

 

1049번: 기타줄

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

www.acmicpc.net

 

문제를 풀기 위해서는 각 상점에서 파는 묶음 상품의 최저가와 개별 상품의 최저가를 저장합니다.  그런후에 묶음상품이 개별상품을 6개 사는 것보다 싼지 검사하고, 비싸다면 묶음상품의 가격을 개별상품*6으로 저장합니다.  필요한 기타줄의 갯수를 6으로 나눈 나머지가 개별상품을 사야하는 것이지만, 이마저도 나머지 갯수*개별상품 가격을 한 것이 묶음상품 가격보다 비싸다면 그냥 묶음상품을 사는 것이 나으므로 그 예외처리를 해줍니다.

 

실수할만한 예제를 모아서 올려드립니다.

입력 출력
13 3
24 3
30 5
29 4
39
17 3
23 5
29 4
19 6
57
98 7
39 6
38 7
36 8
35 9
34 10
33 11
32 12
524

 

제가 작성한 소스입니다.  소스는 참고용으로 봐주세요.

//----------------------------------------------------------
//    baekjoon #1049    - Guitar string
//        - by Aubrey Choi
//        - created at 2019-11-20
//----------------------------------------------------------
#include <stdio.h>

int main()
{
    int n, m, a, b, mp=1000, ms=1000;
    scanf("%d%d",&n,&m);
    while(m--) { scanf("%d%d",&a,&b); mp=(a<mp)?a:mp; ms=(b<ms)?b:ms; }
    if(ms*6<mp)mp=ms*6;
    ms=((n%6)*ms>mp)?mp:(n%6)*ms;
    printf("%d\n",(n/6)*mp+ms);
}
반응형

댓글