728x90

문제

 

소스코드1

#include<iostream>
#include<climits>
using namespace std;

int main()
{
    const int FIVEKG = 5;
    const int THREEKG = 3;

    int input;
    cin >> input;

    int bestCount = INT_MAX;

    //모든 경우의 수를 loop해서 최적의 경우를 찾는방법
    for (int count5 = 0; count5 <= input / FIVEKG; count5++) { //입력에서 5로 나눈만큼 반복
        for (int count3 = 0; count3 <= input / THREEKG; count3++) { //입력에서 3으로 나눈만큼 반복
            if (count5 * FIVEKG + count3 * THREEKG == input) { //5kg과 3kg을 더했을때 입력한값과 같다면
                bestCount = min(bestCount, count5 + count3); // 최소값과 비교해서 값을 할당
            }
        }
    }

    if (bestCount == INT_MAX) //한번도 N킬로그램을 못만들었으면 -1 출력
        bestCount = -1;

    cout << bestCount;
    return 0;
}

 

분석

  for (int count5 = 0; count5 <= input / FIVEKG; count5++) { 
        for (int count3 = 0; count3 <= input / THREEKG; count3++) {
            if (count5 * FIVEKG + count3 * THREEKG == input) {
                bestCount = min(bestCount, count5 + count3);
            }
        }
    }

 

  1. 이중 반복문을 통해 5와 3으로 나누어지는 모든 경우에 대해 최소 카운트와 비교를 하는 코드이다.
  2. input / FIVEKG , input /THREEKG을 조건으로 반복문을 사용한 이유는 봉지의 최대 사용 개수를 넘지 않도록 보장하기 위함이다.

 

 

소스코드2

#include<iostream>
using namespace std;

int main() {
    int N;
    cin >> N;

    int count = -1;

    for (int count5 = N / 5; count5 >= 0; count5--) { //5로 나눌수있는만큼 반복
        int remainingWeight = N - count5 * 5; //만약 N이 3인경우 remainingWeight에 3할당
        if (remainingWeight % 3 == 0) { // 3 % 3이 0이면
            count = count5 + remainingWeight / 3; // 0 + 3/3 = 1
            break;
        }
    }

    cout << count;
    return 0;
}

 

분석

소스코드 1에 비해 더 간결하고 직관적인 코드라고 생각한다.

for (int count5 = N / 5; count5 >= 0; count5--) { //5로 나눌수있는만큼 반복
        int remainingWeight = N - count5 * 5; //만약 N이 3인경우 remainingWeight에 3할당
        if (remainingWeight % 3 == 0) { // 3 % 3이 0이면
            count = count5 + remainingWeight / 3; // 0 + 3/3 = 1
            break;
        }
    }

 

  1. 5로 나눌 수 있는 만큼 반복을 한다 //4입력 시 일단 코드 한번 실행 후 count에는 아무 값도 할당 x -> -1이 그대로 남음
  2. remainingWeight에는 입력값 - count*5를 할당하는데 이때 5로 나눌 수 없다면 입력값 그대로 할당
  3. remainingWeight%3의 나머지가 0이라면 == 3으로 나누어 딱 떨어진다면 다음 수식으로 계산

 

이번 문제는 생각보단 좀 더 복잡했던 문제였던 것 같습니다.

728x90

+ Recent posts