알고리즘: 그리디
아래 규칙만 알면 풀기 쉽다.
- 30의 배수는 0이 필수적으로 들어가야한다. 숫자에 0이 들어가있지 않다면 그 수는 30의 배수가 아니다.
- 30의 배수는 각 자리 수를 모두 합한 수를 3으로 나누어 떨어진다면 그 수는 30의 배수이다. 나누어 떨어지지 않는다면 그 수는 30의 배수가 아니다.
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
const input = fs.readFileSync(filePath).toString().trim().split('');
solution(input);
function solution(input) {
if (!input.includes('0')) {
// 1
console.log('-1');
} else {
const sum = input.map(Number).reduce((acc, cur) => acc + cur); // 2
if (sum % 3 !== 0) return console.log('-1'); // 3
const result = input.sort((a, b) => b - a).join('');
console.log(result);
}
}
- 입력 값에 0이 포함되어있는 지 확인한다. 포함되어있지 않다면 -1 출력
- map 을 통해 총 숫자형 타입으로 변환 후 각 자리 수의 합을 reduce 로 구한다.
- 각 자리수의 합을 3으로 나누었을 때 나누어 떨어지지 않는다면 -1을 출력하고 함수를 빠져나간다.
- 나누어 떨어진다면 30의 배수이므로 내림차순으로 정렬 후 하나의 합쳐준다
[ ‘8’, ‘8’, ‘7’, ‘5’, ‘5’, ‘4’, ‘2’, ’0’ ] → 88755420