본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 16496 : 큰 수 만들기

by 개발하는 곰돌이 2023. 4. 3.

문제 링크

 

16496번: 큰 수 만들기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 리스트에 포함된 수가 주어진다. 수는 공백으로 구분되어져 있고, 1,000,000,000보다 작거나 같은 음이 아닌 정수 이다. 0을 제외한 나

www.acmicpc.net


문제 해설

기본적으로는 정렬을 활용한 문제지만 정렬 기준을 어떻게 할지가 관건인 문제라고 볼 수 있다. 수를 이어붙여서 더 큰수를 만들기 위해서는 수를 문자열로 다뤄야 한다.

 

정렬 기준자체는 굉장히 간단하다. s1과 s2가 있을 때, s1 + s2와 s2 + s1 중 더 큰것이 우선적으로 오도록 정렬하면 된다. 예를 들어 123과 45가 있을 때 12345보다 45123이 더 크기 때문에 [45, 123]으로 정렬할 수 있다.

 

출력 조건에 수는 0으로 시작하면 안되며, 0이 정답인 경우에는 0 하나만 출력해야 한다고 되어 있는데, 상술한 조건대로 정렬한 숫자들을 나열한 결과가 0이 아닌 수라면 0으로 시작할 수 없다. 따라서, 배열의 0번째 요소가 0이라면 0을 출력하면 된다. 또는, 배열에서 0의 개수가 배열의 크기와 같은 경우도 정답이 0인 경우에 해당한다. 두 경우 모두 시간차이가 발생하진 않았다.

 

0번째 요소가 0인지 검사한 코드
0의 개수를 센 코드

Code

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val numbers = StringTokenizer(readLine()).run { Array(n) { nextToken() }.sortedArrayWith { o1, o2 -> (o2 + o1).compareTo(o1 + o2) } }
    println(numbers.takeUnless { it.count { c -> c == "0" } == it.size }?.joinToString("") ?: 0)
}

댓글