상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력
18
출력
4
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "BOJ/input.txt";
let input = fs.readFileSync(filePath).toString();
let sugar = Number(input);
let error = -1; // 정확하게 N킬로그램을 만들 수 없을 경우 -1을 출력하기 위함
let five = Math.floor(sugar / 5); // 큰 수인 5kg이 얼마나 들어갈 수 있는 지 계산
while(five >= 0) {
// 큰 수를 빼고 남은 설탕이 얼마인지 계산
let left = sugar - (five * 5);
if(left % 3 === 0) {
error = left / 3 + five;
break;
} else {
// 3으로 나누어 떨어지지 않으면 N킬로그램을 만들 수 없다.
// 큰 수를 하나 뺴주고 다시 구해줌
five -= 1;
}
}
console.log(error);
처음 문제를 접근했을 땐 "최소 봉지 수를 구해야 하니 먼저 5kg으로 나눌 수 있는 것은 최대한 나눈 뒤, 나머지 설탕 량 / 3 을 구해서 더하면 되겠다" 라는 생각으로 접근했었다. 그러니 안되는 경우가 있었다. (6은 내가 생각한 방식대로 접근하면 5kg 1개에 설탕 1kg가 뜨기 때문에 -1이 결과로 도출됐었다...)
따라서 이를 수정하기 위해 1~14kg의 경우, 15kg 이상의 경우를 나누어 코드를 짜봤는데 이건 아닌 거 같은데... 라는 생각이 자꾸만 들었다. 11의 경우 내가 짰던 코드에 입력값으로 넣으면 5kg 2개에 1kg이 남기 때문에 -1이 도출됐다. 하지만 11kg은 5kg 1개, 3kg 2개로 만들면 남는 설탕이 없이 나누어 떨어진다. 무작정 5kg으로 담을 수 있는 최대 양을 구해버리니 답이 도출이 안된다.
결국 구선생님의 도움을 받아 코드를 작성 할 수 있었다. 위 정답 코드는 우선 주어진 입력값에서 5로 나눌 수 있는 갯수를 구하고 while문을 사용해 5로 나눈 몫을 1씩 빼면서 경우를 확인하는 코드였다.
알고리즘 공부를 더욱 열심히 해야겠다....🔥
https://velog.io/@hadam/JS-%EB%B0%B1%EC%A4%80-2839-%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC