본문 바로가기
백준 코딩테스트 연습/실버

[백준] 10610번 30 (Kotlin, 코틀린)

by KwakEuiJin 2023. 2. 15.

문제

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

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

입력

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

출력

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

 

 

예제 입력 3

2931

예제 출력 3

-1

예제 입력 4

80875542

예제 출력 4

88755420
 

 

문제 접근

  1.  일단 해당 문제가 왜 그리디 알고리즘인지 잘 모르겠다. 수학적인 요소가 더 많이 작용하였다.
  2. 30의 배수이기 위해서는 입력에 0이 하나라도 포함되어있거나, 각 자릿수의 숫자를 더했을 때 3의 배수여야 한다.
  3. 해당 조건을 제외하고 가장 큰 수로 정렬하여 정답을 출력한다. 

 

알고리즘

  1. 입력 받은 문자열을 Array<Char>의 형태로 변형 한다.
  2. 변형한 배열에 30의 배수 조건인 0이 포함되어있는지 , 각 자릿수의 합이 3으로 나누어지는지를 판별한다.
  3. 만약 나누어진다면 내림차순 정렬의 입력을 숫자로 변형하여 출력한다.

 

정답 코드

fun main() {
    val input = readln().toCharArray().sortedArrayDescending()
    if (!input.contains('0') || input.map { Character.getNumericValue(it).toBigDecimal() }.sumOf { it } % 3.toBigDecimal() != 0.toBigDecimal()) {
        println("-1")
        return
    }
    println(input.joinToString("").toBigDecimal())
}

 

헷갈리던 부분: N이 10^5개의 숫자로 이루어졌다는 전제조건이 이해가 안갔다.

 

헷갈리던 부분으로 인해 자릿수의 오류를 범하는 실수를 하였고 toLong -> toBigDecimal로 바꾸어 더 많은 자릿수 계산을 가능하게 해서 해결하였다.

댓글