[개발]자국/[백준]

[백준] 2839 번 : 설탕 배달 / C++

DevCat_ 2023. 7. 23. 22:45

[문제]

문제 :

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

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

 

입력 : 

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

 

출력 :

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

 

[코드 풀이]

[실패한 코딩]

없다!

[성공한 코딩]

더보기

 그리디 알고리즘을 통해서 풀었다. Total_Candy로 설탕의 무게를 받고, num3와 num5는 3kg, 5kg 봉지의 개수이다.

numtotal은 봉지의 총 개수.

working은 3kg, 5kg로 봉지를 나누어 담을 수 있는 지 안 되는지 판단한 값을 저장하는 변수이다.

 

1. 설탕의 무게를 정확하게 봉지에 담아서 배달해야한다.

2. 봉지의 개수를 최대한 적게 사용해야한다.(최대한 5kg 봉지를 사용해야한다.)

 

  •  설탕의 무게를 담을 때 5kg 봉지에 담을 수 있는만큼 담는다. 나머지 남은 설탕이 3kg 봉지를 이용해서 담는다.
  • 이때, 3kg 봉지로 나눠떨어지도록 담을 수 있지 않다면, 5kg 봉지의 개수를 하나 빼고, 3kg 봉지를 더 써서 설탕을 담는 방식으로 한다.[while문에 있는 내용이다.]
  • 그렇게 5kg 봉지를 하나도 쓰지 않을때도, 3kg 봉지로 나눠 떨어지게 담을 수 없다면, -1을 출력하도록한다.[코드에서 working 변수를 통해서 구분한다.]
#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int Total_Candy;

	int remember;
	int num3 = 0;
	int num5 = 0;

	int numtotal = 0;

	int working = 0;

	cin >> Total_Candy;

	remember = Total_Candy;
	num5 = Total_Candy / 5;

	while (num5 != -1 ) {
		Total_Candy = Total_Candy -(5*num5);

		num3 = Total_Candy / 3;

		
		if (Total_Candy % 3 != 0) {
			num5--;
			Total_Candy = remember;
		}
		else if (Total_Candy % 3 == 0) {
			working = 1;
			break;
		}
	}
	numtotal = num3 + num5;
	if (working == 0) {
		cout << -1 << '\n';
	}

	if (working == 1) {
		cout << numtotal << '\n';
	}


	return 0;
}

 

[후기 및 배운 점]

그리디 알고리즘에 대해서 기초적으로 알 수 있는 문제였다. 거스름돈 문제와 유사했다.