본문 바로가기
백준 문제 풀이 & C++ 공부

백준 2839번 C/C++

by daisy0461 2021. 3. 1.

www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

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

www.acmicpc.net

이 문제를 처음 접했을 때 생각한 방법은 n의 값을 받아온 다음 5를 최대한 빼고 그 다음에 3을 빼는 방식을 선택했습니다.

하지만 이렇게 되니 문제점이 나왔습니다. 11의 경우에 5, 3, 3으로 가능하지만 5, 5, X가 되어서 -1이 나오는 것이었습니다.

 

그래서 다른 방식을 선택을 하였는데 fiveCount라는 5를 얼마나 뺄 수 있는지를 늘려가면서 하는 것이었습니다. 이 방식도 귀찮은게 break식을 정하는 것이  까다로운 것 같아서 이 생각으로 진행을 하다가 그만뒀습니다. 

 

다음에 이 문제를 풀 수 있게 만들어준 생각인데 fiveCount를 처음에 구해주고나서 fiveCount를 줄여가면서 하는 것이었습니다. 이렇게 되면 5가 가장 많을 때 부터 시작을 해서 fiveCount를 하나씩 줄어주면서 계속 확인이 가능했습니다.

이러한 방식으로 생각을 하고 코딩을 한 다음 제출 하였을 때 성공했습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

//상근이는 사탕가게에 정확하게 N킬로그램을 배달해야한다.
//설탕 봉지는 3키로와 5키로가 있다.
//최대한 적은 봉지를 들고가려고 한다.
//ex) 18kg이면 5키로 3개 3키로 1개 처럼

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

	int fiveCount = 0;
	while (checkN > 0) {
		checkN -= 5;
		fiveCount++;
	}
	if (checkN < 0) {		//5로 더 이상 안되는 상태에서 -를 해줬기 떄문에 음수가 나온다. 그렇기에 fiveCount--를 한번 해준다.
		fiveCount--;
	}

	int count = 0;
	int backupN = n;
	while (1) {
		n = backupN;

		count = 0;
		if (fiveCount < 0) {
			printf("-1");
			break;
		}

		for (int i = 0; i < fiveCount; i++) {
			n -= 5;
			count++;
		}
		if (n == 0) {
			printf("%d", count);
			break;
		}

		while (n > 0) {
			n -= 3;
			count++;
		}
		if (n == 0) {
			printf("%d", count);
			break;
		}

		fiveCount--;
	}
	
}

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 4553번 C/C++  (0) 2021.06.14
백준 2869번 C/C++  (0) 2021.03.01
백준 2798번 C/C++  (0) 2021.02.27
백준 2275번 C/C++  (0) 2021.02.27
백준 2805번 C/C++  (0) 2021.02.24