Problem:
問題 3

　入力ファイルの１行目に正整数 n （n≧3）が書いてあり，
つづく n 行に異なる正整数 a1, ..., an が
１つずつ書いてある．
a1, ..., an から異なる２個を選んで作られる
順列を（数として見て）小さい順に並べたとき，
３番目に来るものを出力せよ．

　ただし，
例えば，a1 = 1，a4 = 11 のような場合も，
a1a4 と a4a1 は異なる順列とみなす．
また，
1≦ai≦10000 (i=1, ..., n) かつ 3≦n≦104 である．

出力ファイルにおいては，
出力の最後にも改行コードを入れること．

入出力例

入力例１

3
2
7
5

出力例１

52

入力例２

4
17
888
1
71

出力例２

171

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Kotlin (judge verdict: Accepted)

import java.util.*

fun main(args: Array<String>) {
    val numbers = Numbers()
    (1..readLine()!!.toInt()).forEach {
        numbers.addValue(readLine()!!.toInt())

    }
    numbers.printValue()
}

class Numbers(private val digits: MutableMap<Int, DigitNumbers> = TreeMap()) {

    fun addValue(value: Int) {
        val digit = value.toString().length
        addValue(digit, value)
    }

    private fun addValue(digit: Int, value: Int) {
        val digitNumbers = digits[digit] ?: DigitNumbers()
        digitNumbers.addIfNeeded(value)
        digits[digit] = digitNumbers
    }


    fun printValue() {
        val values = mutableListOf<Int>()
        digits.values.forEach {
            values.addAll(it.values)
            if (values.size >= 3) {
                return@forEach
            }
        }

        println(values.flatMap { v -> values.filter { v != it }.map { "$it$v".toInt() }.toList() }.sorted()[2])
    }
}

class DigitNumbers(private val numbers: MutableList<Int> = mutableListOf()) {

    companion object {
        private const val LIMIT_VALUE = 3
    }

    val values: List<Int> get() = numbers

    fun addIfNeeded(value: Int) {
        if (numbers.size <= LIMIT_VALUE) {
            numbers.add(value)
        } else if (numbers.max()!! >= value) {
            numbers.add(value)
            numbers.sort()
            numbers.removeAt(numbers.size - 1)
        }
    }
}