본문 바로가기

알고리즘(w.KOTLIN)/그리디(Greedy)

[백준][코틀린][10610] 30

728x90

https://www.acmicpc.net/problem/10610

 

10610번: 30

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

www.acmicpc.net

문제 풀이

1. 주어진 숫자를 30의 배수 중 가장 큰 수가 되게 하기 위해서 다음과 같은 조건을 찾는다.

2. 30의 배수는 3의 배수와 10의 배수의 최소 공배수이다.

3. 따라서 주어진 숫자는 10의 배수가 되면서 3의 배수도 되어야 한다.

4. 주어진 숫자를 내림 차순으로 정렬한다.

5. 10으로 나누어 떨어지지 않으면 -1을 출력한다.

6. 첫자리 부터 마지막 자리까지 더한 합을 3으로 나누었을 때 나누어 떨어지지 않으면 -1을 출력한다.

7. 나누어 떨어지면 더한 합을 출력한다.

코드

import java.io.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val N = br.readLine()

    if (N.contains("0")) {
        val number = N.toCharArray()
        number.sortDescending()

        if (number[number.size - 1].digitToInt() != 0) {
            println(-1)
        } else {
            var sum = 0
            for (i in 0 until number.size - 1) {
                sum += number[i].digitToInt()
            }

            if (sum % 3 == 0) println(String(number))
            else println(-1)
        }
    } else {
        println(-1)
    }
}
728x90