[백준] 10610 30 Node.js (Greedy)

Janet·2023년 6월 29일
0

Algorithm

목록 보기
237/314

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

예제 입력 1

30

예제 출력 1

30

예제 입력 2

102

예제 출력 2

210

예제 입력 3

2931

예제 출력 3

-1

예제 입력 4

80875542

예제 출력 4

88755420

문제풀이

💡 문제풀이 과정

  • 30의 배수는 항상 0으로 끝난다. (30, 60, 90, 120, 210 …) 따라서 입력값에 ‘0’이 포함되어 있는 경우 30의 배수가 될 수 없으므로 바로 -1 출력한다.
  • ‘0’이 포함되어 있는 경우, 입력값을 한 자리씩 모두 더하여 3의 배수인지 파악한다.
    • input: 102인 경우: 102 ⇒ 0이 포함된 케이스 ⇒ 1 + 0 + 2 = 3 ⇒ 3의 배수이다. (만약 3의 배수가 아니라면 -1 출력한다.)
    • 0이 포함 되었고, 3의 배수인 경우 문자열을 조합하여 만들 수 있는 최대값은 해당 문자열을 내림차순 정렬하는 것이다. ⇒ 102 → 210

✅ 답안

const filePath = process.platform == 'linux' ? '/dev/stdin' : './input.txt';
const N = require('fs').readFileSync(filePath).toString().trim().split('');

function solution(input) {
  if (!input.includes('0')) return console.log(-1);
  const sum = input.reduce((a, b) => a + +b, 0);
  if (sum % 3 !== 0) return console.log(-1);
  console.log(input.sort((a, b) => b - a).join(''));
}
solution(N);
profile
😸

0개의 댓글