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

    2020. 4. 25.

    by. 데롱디롱

    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만으로도 풀 수 있는 건데, 괜히 벡터쓰고 ㅜㅜ
    뭐가 맞는건지 잘 모르겠다.. 꾸준히 하다보면 잘 할 수 있겠지?

    댓글