사실 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 |