Baekjoon

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

yujin0517 2022. 1. 25. 01:12

2839번 - 설탕 배달

 

<코드 작성>

  1. 설탕 무게 입력받기
  2. cnt_x, cnt_y 변수를 선언하여, cnt_x에는 설탕 무게를 5로 나눈 몫을 대입
  3. while 반복문을 사용하여 봉지의 최소 개수 구하기
#include <iostream>
using namespace std;

int main() {
	int N;
	cin >> N; 
    
	int cnt_x = N / 5;
	int cnt_y;

	while (1) {
		if (cnt_x < 0) {
			cout << "-1";
			return 0;
		}
		else if ((N - cnt_x * 5) % 3 == 0) {
			cnt_y = (N - cnt_x * 5) / 3;
			break;
		}
		cnt_x--;
	}

	cout << cnt_x + cnt_y << '\n';

	return 0;
}

 

 

처음 이 문제를 풀 때는 단순히 경우의 수를 체크하여 코드 작성을 시작했습니다. 

먼저 크게 설탕의 무게가 5로 나눠 떨어지는 경우와 3으로 나눠 떨어지는 경우 그리고 5kg 봉지와 3kg 봉지를 섞어 사용하는 경우로 나누었습니다. 

이렇게 코드를 작성했을 때, 설탕의 무게가 18kg일 경우에는 5kg 봉지 3개와 3kg 봉지 1개를 사용하여 문제를 풀 수 있었습니다. 

하지만 설탕의 무게가 11kg일 경우가 문제였습니다. 

코드를 작성할 때 기본적으로 봉지를 최소한으로 사용하기 위해 설탕의 무게를 5로 나누고 나머지를 3으로 다시 나누어 나눠 떨어지는 경우 봉지의 개수를 출력하고 그렇지 않은 경우 -1을 출력하도록 구현하였습니다. 

이렇게 구현을 하니 당연히 11을 입력하면 -1이 출력되었습니다. 

그래서 단순히 경우의 수만 체크하며 코드를 작성하는 방식이 아닌 설탕의 무게를 먼저 5로 나눈 뒤 그 몫을 1씩 줄여나가며 최소한으로 필요한 봉지의 개수를 구하는 방식을 찾게 되었습니다. 

지금 생각해보면 경우의 수로 문제를 푼다는 생각은 조금 무식한 방법이었던 것 같기도 합니다...

아무튼 또 하나 배워갑니다!!

그리고 추가적으로 return과 break의 차이점(?)도 다시 한번 생각하게 된 계기가 되었습니다.

아주 기본적인 것이지만 처음에 코드를 작성할 때 while문을 종료시킬 생각에 if와 else if를 구현할 때 둘 다 break를 사용하여 종료하였습니다. 

생각을 조금 더 해보면 if의 경우는 -1이 출력되어 프로그램을 종료하는 것과 마찬가지기에 return을 사용하여 메인 함수 자체를 종료시키고, else if의 경우에는 반복문 종료 후 결과 값을 출력해야 하기에 반복문만 종료시키는 break를 사용하는 것이 맞았습니다.

설탕 배달 덕분에 두 가지를 배워갑니다!!

 

감사합니다.

2022.01.24