기본 수학 1. 7단계
2839번. 설탕 배달
const fs = require("fs");
const input = Number(fs.readFileSync("/dev/stdin").toString());
// 아무런 조건에도 해당되지 않을 경우 -1이 출력되도록 설정
let result = -1;
// 5로 최대한 나눠서 나머지 무게를 최대한 줄여야 최소 개수가 나올 수 있다.
let count5 = Math.floor(input / 5);
while (count5 >= 0){
// (위에서 구한 count5 * 5)만큼 무게에서 제거
const remain = input - (count5 * 5);
if (remain % 3 === 0){
// 나머지 무게가 3의 배수라면, 3과 5의 합으로 표현 가능
// 나머지 무게가 0이어도 if문 동작함.( = 전체 무게가 5의 배수로 나누어 떨어지는 경우)
result = (remain / 3) + count5;
break;
} else {
// 전체 무게가 5의 배수가 아니었거나,
// 나머지 무게가 3의 배수가 아니라면
// count5에서 -1을 해가면서 3의 배수인지를 계속 확인함
// 이게 바로 while문의 조건문이 (count5가 0 이상)으로 표현되는 이유
count5 -= 1;
}
}
console.log(result);
처음에는 경우의 수를 생각해서 if문으로 구현했었다.
input이
1. 3과 5의 배수 or 5이 배수 = 5로 나누면 최소 개수
2. 3의 배수 = 3으로 나누면 최소 개수
3. 5와 3의 합으로 표현 가능한 수
= 5로 나눈 나머지가 3의 배수인 경우
= 5로 나눈 몫, 나머지를 3으로 나눈 값의 합이 최소 개수
그런데...
3번 경우에서 예외가 있었다. 문제 예제 입출력으로도 나와있는 11이 그것이다.
5로 나눈 몫은 2, 나머지는 1이기 때문에 3의 배수에 해당은 안되지만
5*1 + 3*2로 표현이 가능하다.
이 예외 상황을 표현하기가 쉽지가 않았다.
다른 분들의 풀이를 봤더니 정말 참신했다...
다른 분은 이 예외 상황을 5kg의 개수를 줄여나가면서 연산을 반복하는 것으로 구현했다.
큰 줄기는 같은데 이런 식의 생각을 할 수 있다는게 정말 놀라울 뿐이다..
참고 사이트