C언어/BAEKJOON

[백준] 2839. 설탕 배달

너굴맨이해치움 2022. 6. 18. 21:23

: solved.ac class 2 - silver 4

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

 

2839번: 설탕 배달

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

www.acmicpc.net

 

 

예제 입력 1

18

 

예제 출력 1

4

 

예제 입력 2

4

 

예제 출력 2

-1

 

예제 입력 3

6

 

예제 출력 3

2

 

예제 입력 4

11

 

예제 출력 4

3

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	int bag = 0;
	scanf("%d", &n);

	while (1) {

		if ((n % 5) == 0) {
			bag += (n / 5);
			break;
		}
		else {
			n -= 3; 
			bag++;

			if (n == 0) break;

			if (n <= 2) {
				bag = -1;
				break;
			}
		}
	}
	
	printf("%d", bag);

	return 0;
}

 


해설

: 가능한 만큼 5kg짜리 봉지의 수가 많게 해야 한다. 즉, 3kg 봉지 수가 최소가 되도록 해야 한다.

 

  1. 주어진 무게가 5로 나누어떨어지면 그 몫을 그대로 반환한다.
  2. 만약 그렇지 않으면 거기에서 3을 뺀다.
  3. 3을 뺀 무게가 0인지, 혹은 2 이하의 자연수인지, 혹은 3 이상으로 남았는지 확인한다.
  4. 3 이상으로 남았다면 위의 과정을 반복한다.

 

1. 전체 무게 n을 입력받고 봉지 개수를 카운트할 변수 bag을 만든다.

그리고 나서는 반복문을 돌리는데, 가장 먼저 n이 5로 나누어떨어지는지 확인한다.

만약 나누어떨어진다면 그 몫을 bag에 더해주고 반복을 종료한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	int bag = 0; //봉지 개수
	scanf("%d", &n);

	while (1) {

		if ((n % 5) == 0) {
			//설탕 무게가 5로 나누어떨어지면
			bag += (n / 5);
			//봉지 개수 = 5로 나눈 몫
			break;

 

2. 만약 5로 나누어떨어지지 않는다면 먼저 3을 빼 본다.

3kg을 덜어낸 것이므로, 봉지 수는 하나 늘어났을 것이다. 봉지 수에 1을 더해주고 아래 사항들을 확인한다.

 

1) n이 0이라면 분할이 끝났으므로 그대로 반복을 종료한다.

2) n이 2 이하라면 이는 나눌 수 없다. 봉지는 5kg과 3kg짜리밖에 없고, 그 이하의 양은 담을 수 없기 때문이다.

(반복을 몇 번 더 돌고 온 후에도 이것은 마찬가지이다.)

		else {
			//나누어떨어지지 않으면 3kg을 덜어내고
			//봉지 개수 +1
			n -= 3; 
			bag++;

			//잔량이 0이라면 종료
			if (n == 0) break;

			if (n <= 2) {
				//2kg 이하의 양이 남았다면
				//나눌 수 없는 것으로 처리하고 종료
				bag = -1;
				break;
			}

 

3. 만약 그렇지 않다면 위의 작업을 반복한다.

3씩 빼나가며 5로 나누어지는지, 0이 되었는지, 1이나 2 등 애매한 잔량이 남았는지 검사하면 된다.

반복이 끝나면 합산된 봉지 개수를 결과값으로 출력한다.

			//둘 모두 아니라면 다시 처음부터 반복
		}
	}
	
	printf("%d", bag);

	return 0;
}