[백준] 2839. 설탕 배달
: 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 봉지 수가 최소가 되도록 해야 한다.
- 주어진 무게가 5로 나누어떨어지면 그 몫을 그대로 반환한다.
- 만약 그렇지 않으면 거기에서 3을 뺀다.
- 3을 뺀 무게가 0인지, 혹은 2 이하의 자연수인지, 혹은 3 이상으로 남았는지 확인한다.
- 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;
}