[JS][백준]16206_롤케이크
Algorithm/BaeKJoon

[JS][백준]16206_롤케이크

문제 번호

 

16206번: 롤케이크

오늘은 재현이의 생일이다. 재현이는 친구 N명에게 롤케이크를 1개씩 선물로 받았다. 롤케이크의 길이는 A1, A2, ..., AN이다. 재현이는 길이가 10인 롤케이크만 먹는다. 따라서, 롤케이크를 잘라서

www.acmicpc.net

 

 

 

알고리즘 분류

 

문제 풀이

 그리디 알고리즘을 사용한다. 정렬기준을 생각하는데 매우 오래걸렸다. 

주어진 롤케이크들을 오름차순으로 정렬하되, 10의 배수이면 더 앞쪽에 위치하도록 한다.

예를들어 15 20 25 30 35 가 있다고 하자. 그렇다면 20 30 15 25 35 순서로 배치가 되어야한다. 10의 배수들을 따로 빼서 앞쪽에 오름차순으로 배치하고 나머지 숫자들을 오름차순으로 이어서 배치하면된다.

 

  cakes.sort((a, b) => {
    if (a % 10 === 0 && b % 10 === 0) {
      if (a < b) return -1;
      else if (a > b) return 1;
      return 0;
    } else if (a % 10 === 0 && b % 10 !== 0) {
      return -1
    } else if (a % 10 !== 0 && b % 10 === 0) {
      return 1;
    } else if (a % 10 !== 0 && b % 10 !== 0) {
      if (a < b) return -1;
      else if (a > b) return 1;
      return 0;
    }
  })

 

이제 정렬된 케이크들을 확인하면서 크기가 10보다 크다면 잘라주면서 진행하면된다. 크기가 딱 10이라면 자를 필요없이 정답값만 증가시켜주면 된다.

  for (let i = 0; i < cakes.length; i++) {
    while (cakes[i] > 10) {
      if (M <= 0)
        break;
      cakes[i] -= 10;
      answer++;
      M--;
    }
    if (cakes[i] === 10) {
      answer++;
    }
    if (M <= 0)
      break;
  }

 

전체코드

/*
 * 오름차순으로 정렬하는데 10의 배수면 더 앞쪽에 오게한다.
 */
const input = require('fs').readFileSync('input.txt').toString().trim().split('\n');
let [N, M] = input[0].split(' ').map(Number);
let cakes = input.slice(1)[0].split(' ').map(Number);

function main() {
  let answer = 0;

  cakes.sort((a, b) => {
    if (a % 10 === 0 && b % 10 === 0) {
      if (a < b) return -1;
      else if (a > b) return 1;
      return 0;
    } else if (a % 10 === 0 && b % 10 !== 0) {
      return -1
    } else if (a % 10 !== 0 && b % 10 === 0) {
      return 1;
    } else if (a % 10 !== 0 && b % 10 !== 0) {
      if (a < b) return -1;
      else if (a > b) return 1;
      return 0;
    }
  })


  for (let i = 0; i < cakes.length; i++) {
    while (cakes[i] > 10) {
      if (M <= 0)
        break;
      cakes[i] -= 10;
      answer++;
      M--;
    }
    if (cakes[i] === 10) {
      answer++;
    }
    if (M <= 0)
      break;
  }


  return console.log(answer)
}
main();

특이사항

 정렬 기준을 생각하는데 매우 오래걸렸다. 몫, 나머지 등등 다 생각해봤었는디 ..... 여러가지 기준을 섞어서 사용하는 방법도 종종 생각해보자.

 

'Algorithm > BaeKJoon' 카테고리의 다른 글

[JS][백준]16926_배열 돌리기1  (0) 2022.06.21
[JS][백준]16719_ZOAC  (0) 2022.06.15
[JS][백준]1167_트리의 지름  (0) 2022.06.09
[JS][백준]14627_파닭파닭  (0) 2022.06.09
[JS][백준]7682_틱택토  (0) 2022.06.08