30
문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
예제 입력 1
30
예제 출력 1
30
예제 입력 2
102
예제 출력 2
210
예제 입력 3
2931
예제 출력 3
-1
예제 입력 4
80875542
예제 출력 4
88755420
출처
- Contest > Croatian Open Competition in Informatics > COCI 2014/2015 > Contest #4 1번
- 문제를 번역한 사람: aaa
알고리즘 분류
- 그리디 알고리즘
- 정수론
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim();
// var input = fs.readFileSync(__dirname + '/stdin.txt').toString().replace(/\r/g, "");
var nums = input.split('').sort((a,b)=> b/1-a/1)
var sum = nums.reduce((a,b)=> a/1+b/1)
var answer = -1
if(nums[nums.length-1] == '0' && sum%3 == 0){
answer = nums.join('')
}
console.log(answer)
1. 30의 배수가 되는 조건을 구한다.
30 = 3 * 10
- 10의 배수: 무조건 맨 마지막은 0으로 끝나야 한다.
- 3의 배수: 숫자의 각 자릿수를 다 더해 3으로 나눠 떨어지면 3의 배수이다.
ex. 18 = 1+8 = 9
80875542 = 8+0+8+7+5+5+4+2 = 39즉, 맨 마지막은 0으로 끝나고 && 각 자릿수를 더한 값이 3으로 나눠떨어지는 수여야 한다.
2. 최댓값이어야 한다.
각 자릿수의 숫자들을 내림차순으로 정렬하면 가장 큰 수가 된다.
ex. 1234567 -> 76543213. 위 조건에 해당하는 수를 출력한다.
자바스크립트로 풀 때 trim()
을 꼭 붙여서 입력받아야 한다.
그러지 못해서 몇번이나 실패했던지.. ㅠㅠ