[코딩테스트]백준 - 30

Adela·2020년 7월 12일
0

백준온라인저지

목록 보기
24/53
post-thumbnail

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 -> 7654321

3. 위 조건에 해당하는 수를 출력한다.

자바스크립트로 풀 때 trim()을 꼭 붙여서 입력받아야 한다.
그러지 못해서 몇번이나 실패했던지.. ㅠㅠ

profile
개발 공부하는 심리학도

0개의 댓글