문제
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
입력
N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
출력
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.
예제 입력 3
2931
예제 출력 3
-1
예제 입력 4
80875542
예제 출력 4
88755420
문제 접근
- 일단 해당 문제가 왜 그리디 알고리즘인지 잘 모르겠다. 수학적인 요소가 더 많이 작용하였다.
- 30의 배수이기 위해서는 입력에 0이 하나라도 포함되어있거나, 각 자릿수의 숫자를 더했을 때 3의 배수여야 한다.
- 해당 조건을 제외하고 가장 큰 수로 정렬하여 정답을 출력한다.
알고리즘
- 입력 받은 문자열을 Array<Char>의 형태로 변형 한다.
- 변형한 배열에 30의 배수 조건인 0이 포함되어있는지 , 각 자릿수의 합이 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로 바꾸어 더 많은 자릿수 계산을 가능하게 해서 해결하였다.
'백준 코딩테스트 연습 > 실버' 카테고리의 다른 글
[백준] 1439번 뒤집기 (Kotlin, 코틀린) (0) | 2023.02.17 |
---|---|
[백준] 16953번 A -> B 문제(Kotlin, 코틀린) (0) | 2023.02.16 |
[백준] 1789번 수들의 합 (Kotlin,코틀린) (0) | 2023.02.14 |
[백준] 13305번 주유소 (Kotlin, 코틀린) (0) | 2023.02.13 |
[백준] 2217번 로프 (Kotlin, 코틀린) (0) | 2023.02.12 |
댓글