알고리즘 풀이/백준

[2839] 백준 : 설탕 배달(C++)

데롱디롱 2020. 4. 25. 14:47
728x90

 

* 접근 방법
- 경우의 수가 x로만 이루어짐 / y로만 이루어짐 / x와 y의 조합이므로 
   각 경우의 x+y의 값의 합을 벡터에 저장해 둔 후, 최소값을 출력!

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	int T = 0;
	cin >> T;
	if (T % 3 == 0)
		v.push_back(T / 3);
	if (T % 5 == 0)
		v.push_back(T / 5);

	for (int i = 1; i < T / 3; i++)
	{
		if ((T - 3 * i) % 5 == 0)
			v.push_back((T - 3 * i) / 5 + i);
	}
	if (v.empty())
		cout << -1;
	else
		cout << *min_element(v.begin(), v.end());
	return 0;
}

 

* 생각하지 못한 점
- 모든 경우의 수에서 5로 나누어떨어지는 경우가 항상 최소의 값이므로 이를 먼저 확인 한 후
   반복문을 돌면서 T에서 3을 빼고 5로 나누어떨어지는 지 확인하는 방법으로 계산해도 될 것 같다.

int num = 0;
	while (T > 0)
	{
		T -= 3;
		num++;
		if (T % 5 == 0)
		{
			num = num + T / 5;
			cout << num;
			return 0;
		}
		cout << -1;
		return 0;

 

항상.. 접근방법이 바로바로 생각이 안나서 힘든 것 같다.
특히, 왜 항상 혼자 어렵게 푸는걸까ㅜㅜ 다른사람들은 쉽게 쉽게 생각하던데...
이 문제도 if-else만으로도 풀 수 있는 건데, 괜히 벡터쓰고 ㅜㅜ
뭐가 맞는건지 잘 모르겠다.. 꾸준히 하다보면 잘 할 수 있겠지?