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);
}
}
}
- 이중 반복문을 통해 5와 3으로 나누어지는 모든 경우에 대해 최소 카운트와 비교를 하는 코드이다.
- 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;
}
}
- 5로 나눌 수 있는 만큼 반복을 한다 //4입력 시 일단 코드 한번 실행 후 count에는 아무 값도 할당 x -> -1이 그대로 남음
- remainingWeight에는 입력값 - count*5를 할당하는데 이때 5로 나눌 수 없다면 입력값 그대로 할당
- remainingWeight%3의 나머지가 0이라면 == 3으로 나누어 딱 떨어진다면 다음 수식으로 계산
이번 문제는 생각보단 좀 더 복잡했던 문제였던 것 같습니다.
728x90
'코딩테스트' 카테고리의 다른 글
[백준][C++] 10798 문제 : 세로읽기 (0) | 2023.08.24 |
---|---|
[백준][C++] 4673 문제 : 셀프 넘버 (0) | 2023.08.24 |
[백준][C++] 1110 문제 : 더하기 사이클 (0) | 2023.08.15 |
[백준][C++] 19532 문제 : 수학은 비대면강의입니다 (0) | 2023.08.15 |
[C++] 백준 2798 문제 : 블랙잭 (0) | 2023.08.14 |