본문 바로가기

안드로이드/Kotlin

[Kotlin] 빠른 입출력

사실 Kotlin에서 입출력은 크게 쓸모가 없지만, 알고리즘 문제 풀이를 위해 정리하였습니다.

 

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

해당 문제를 풀이하였습니다. (백준 15552번 빠른 A+B)

 


[일반 입출력]

 

fun main() {
    var T = readLine()!!.toInt()
    
    while (T-- > 0) {
        var twoNums = readLine()!!.split(' ')
        println(twoNums[0].toInt() + twoNums[1].toInt())
    }
}

 

Kotlin으로 할 수 있는 가장 기본적인 입출력입니다. 당연히 해당 코드를 제출하면 시간 초과입니다.

 

빠른 입출력을 얻기 위해 여러 시도를 해봤고, 나름의 방법을 찾았습니다.

입출력 구조를 새로 정의해서 비정상적으로 빠르게 입출력을 하는 코드보다는 당연히 느립니다.

 


[시도 1 - bufferedReader, StringBuilder]

 

우선 시간 초과가 안 나게 하는 것이 먼저입니다. 입출력 구조를 바꿔보겠습니다.

Kotlin은 Java와 호환되므로 Java에서 애용한 빠른 입출력을 가져왔습니다.

 

fun main() = with(System.`in`.bufferedReader()) {
    var T = readLine()!!.toInt()
    var sb = StringBuilder()

    while (T-- > 0) {
        var vars = readLine()!!.split(' ')
        sb.append(vars[0].toInt() + vars[1].toInt()).append('\n')
    }
    println(sb.toString())
}

 

Java와는 다르게 bufferedReader객체를 따로 선언하지 않고 with()를 사용하여 일반 readLine을 buffer를 이용한 방식으로 바꿨습니다.

 

이렇게만 제출하여도 통과합니다.

 

결론: bufferedReader()와 StringBuilder()를 사용하는 것이 좋습니다.

 


[시도 2 - readln]

 

시간을 더 단축하기 위해 다른 시도를 더 해보겠습니다.

구글링을 하던 도중 readln()이라는 함수를 찾았습니다.

 

fun main() {
    var T = readln().toInt()
    var sb = StringBuilder()

    while (T-- > 0) {
        var vars = readln().split(' ')
        sb.append(vars[0].toInt() + vars[1].toInt()).append('\n')
    }
    println(sb.toString())
}

 

시간 초과는 피할 수 있으나 상대적으로 느립니다.

추가로 readLine()과는 다르게 null을 받을 수 없게 돼 있어 !!키워드를 안 붙여도 됩니다.

 

결론: 편의를 위해 readln()을 사용해도 좋긴 하지만 상대적으로 느립니다.

 


[시도 3 - StringTokenizer]

 

Java에서도 StringTokenizer()를 애용했기에 똑같이 적용했습니다.

 

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    var T = readLine().toInt()
    var sb = StringBuilder()

    while (T-- > 0) {
        val st = StringTokenizer(readLine())
        sb.append(st.nextToken().toInt() + st.nextToken().toInt()).append('\n')
    }

    print(sb.toString())
}

 

역시 split보다 빠릅니다.

 

결론: split보다는 StringTokenizer가 빠르다.

 


[최종 코드]

 

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    var T = readln().toInt()
    var sb = StringBuilder()

    while (T-- > 0) {
        val st = StringTokenizer(readln())
        sb.append(st.nextToken().toInt() + st.nextToken().toInt()).append('\n')
    }

    print(sb.toString())
}

'안드로이드 > Kotlin' 카테고리의 다른 글

[Kotlin] 조건문  (0) 2024.04.30
[Kotlin] 변수와 상수  (0) 2024.04.22
[Kotlin] 문법 기초  (0) 2024.04.21
[Kotlin] Log 사용하기  (0) 2024.04.17
[Kotlin] 생성자  (0) 2023.01.10