✏️기록하는 즐거움
article thumbnail

Link

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다.
예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력 > 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력 > 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

| 예제 입력

18

| 예제 출력

4

 

제출

const input = Number(
  (process.platform == "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `18`
  ).trim()
);

const N = input;
let count = [];

for (let i = 0; i <= N / 3; i++) {
  let bigBag = (N - 3 * i) / 5;

  if (Number.isInteger(bigBag)) {
    count.push(bigBag + i);
    continue;
  }
}

console.log(count.length === 0 ? -1 : count[0]);

 

풀이과정

조건 정리

(1) 3 ≤ N ≤ 5000

(2) 정확하게 N 키로그램이 아닐 시 -1 출력

(3) 봉지는 3kg, 5kg만 존재

 

로직 정리

(1) 봉지의 수를 담을 배열 선언

(2) 3kg, 5kg 봉지가 있으므로 3x + 5y = N 이 되는 모든 x,y를 찾는다.

(3) 봉지의 수는 x+y 이므로, x,y가 정수일 때 x+y를 배열 요소로 추가한다.

(4) 최솟값을 구해야 하기 때문에 오름차순 정렬 후 첫 번째 요소를 출력한다.

 

x는 3의 변수, y는 5의 변수이고, x보다 y가 커야 x+y의 값이 작아진다.

따라서 x=0일때 부터, N / 3 때까지 for문을 실행한다.

y의 값은 3x + 5y = N 식으로 구할 수 있다.

x는 이미 정수일 때를 다루고 있기 때문에 y가 정수일 때만 체크해서 배열에 넣고, 정렬해주면 된다.

 

첫 번째 제출 - 오답

const input = Number(
  (process.platform == "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `18`
  ).trim()
);

const N = input;
let count = []; // 봉지의 수를 담을 배열


for (let i = 0; i <= N / 3; i++) {
   // 3x + 5y = N 식을 사용하여 문제 풀이
  let bigBag = (N - 3 * i) / 5; 

  if (Number.isInteger(bigBag)) {
  // x, y가 정수일 때만 배열에 추가 후 정렬
    count.push(bigBag + i); 
    count.sort();
    continue;
  }
}

// 정수가 아닐 땐 count에 추가되지 않으므로 -1 출력
console.log(count.length === 0 ? -1 : count[0]);

🔼 조건과 로직에 따라 작성했다고 생각했는데 오답이 나와버렸다.

검색을 통해 반례들을 넣어봐도 맞는 결과가 나와서 어떤 것이 문제인지 더 찾을 수 없었다.

두 번째 제출 - 정답

const input = Number(
  (process.platform == "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `18`
  ).trim()
);

const N = input;
let count = [];

for (let i = 0; i <= N / 3; i++) {
  let bigBag = (N - 3 * i) / 5;

  if (Number.isInteger(bigBag)) {
    count.push(bigBag + i);
    continue;
  }
}

console.log(count.length === 0 ? -1 : count[0]);

 🔼 count를 정렬하는 코드를 제거하니 정답이 나왔다.

이미 bigBag + i가 오름차순으로 배열에 들어가고 있는데 sort까지 해줘서 오답이 나온건지.. 아직 정확한 답을 내리진 못했다.

 

개념

Number.isInteger()

  • 괄호 안에 주어진 값이 정수인지 판별한다.
  • 정수면 true, 정수가 아니면 false를 반환한다.

Comment

 

profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!