본문 바로가기
<알고리즘 문제풀이&연습>/[C++] 백준

[백준 2839] 설탕 배달

by 사용자 BlockDMask 2017. 11. 12.
반응형
  • 안녕하세요. BlockDMask 입니다.

  • 글을 오랜만에 올리는거 같습니다.
    171023 문제 빼먹음 -> 171112 완료

0. 제목

  • 백준 2839 설탕 배달

  • BOJ 2839 설탕 배달

1. 문제 설명

  • 상근이가 설탕 공장에서 설탕을 배달하고 있습니다.
    상근이는 지금 설탕 가게에 설탕을 정확하게 N 킬로그램을 배달해야 합니다.
    설탕공장에서 만드는 설탕은 봉지에 담겨져 있는데, 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있습니다.
    상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 합니다.

  • 예를 들어, 18 킬로그램 설탕을 배달해야 할때, 
    3킬로그램 봉지 6개를 가져가도 되지만 
    5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달 할 수 있습니다.

  • 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

  • 입력
    첫째 줄에 N이 주어진다. (3<=N<=5000)

  • 출력
    상근이가 배달하는 봉지의 최소 개수를 출력합니다.
    만약, 정확하게 N킬로그램을 만들 수 없다면 -1 을 출력합니다.

2. 풀이 과정

  • a. 입력을 받은 n이 작은봉지(3키로) 보다 작은지.
    최소의 봉지 개수를 알아야 하므로 큰 봉지가 최대로 들어갈 수 있는 개수 부터 체크를 합니다.
    큰 봉지 최대로 들어가고 그 나머지를 작은 봉지로 담을수 있는지.
    그렇지 않으면
    큰 봉지 최대로 들어간거에서 하나 빼고
    그 나머지를 작은 봉지로 담을 수 있는지.
    .
    .
    .
    이런식으로 해서 큰 봉지가 0개 들어간것과 작은 봉지가 다 들어간것. 까지
    체크를 하고 이렇게 체크하는데 답이 없으면 -1을 리턴 합니다.
    숫자로 표현을 하면

  • b. n 을 큰 봉지로 나눈 몫 bigMax 을 구하고. bigMax>=0 인 만큼 반복문을 돌립니다.
    이때  n - (bigMax*BIG) 을 tmp 변수에 넣습니다.
    tmp는 n에서 큰봉지의 갯수와 키로만큼의 양을 뺍니다.
    그려면 tmp에는 큰 봉지의 개수를 뺀 만큼의 설탕들이 남습니다.
    이 tmp가 작은봉지의 키로수로 나누어 떨어지면 
    그때의 값이 답이 됩니다.
    그렇지 않으면 
    bigMax(큰 봉지의 몫)을 하나씩 줄이면서 체크 합니다.


3. 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//https://www.acmicpc.net/problem/2839
//BOJ_2839_sugar
 
#include<iostream>
#define BIG 5
#define SMALL 3
using namespace std;
 
int solution(int& n){
    if(n<SMALL) return -1// n이 3보다 작으면 -1
    int bigMax = n/BIG; //5로 나누었을때 몫
 
    while(bigMax>=0){   //5로 나누었을떄의 몫을 하나씩 감소하면서 계산
        int tmp = n-(BIG*bigMax);   //tmp는 전체 에서 5*몫을 뺀 값
        if(tmp % SMALL ==0){    //tmp가 3으로 나눈 나머지가 0인 경우(0도 포함됨)
            return bigMax + (tmp/SMALL);;   //5의 개수 + 3의 개수
        }
        bigMax--;
    }
    return -1;
}
 
int main(void){
    int n;
    int result;
    cin >> n;
 
    result = solution(n);
 
    cout << result;
    return 0;
}
cs


4. 인증



문제 출처 - https://www.acmicpc.net/problem/2839

감사합니다.

반응형

'<알고리즘 문제풀이&연습> > [C++] 백준' 카테고리의 다른 글

[백준 1120] 문자열  (0) 2017.11.14
[백준 2443] 별찍기6  (0) 2017.11.14
[백준 11721] 열 개씩 끊어 출력하기  (0) 2017.11.14
[백준 2442] 별찍기5  (0) 2017.11.13
[백준 2839] 설탕 배달  (0) 2017.11.12
[백준 2441] 별찍기4  (0) 2017.11.07
[백준 2440] 별찍기3  (0) 2017.11.06
[백준 2023] 신기한 소수  (1) 2017.11.05
[백준 2920] 음계  (0) 2017.11.03

댓글0