ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코틀린(Kotlin) - "입력"에 대하여
    모바일 프로그래밍 2026. 1. 19. 22:31

    kotlin Input 에 대하여..

    참조 :

    https://kotlinlang.org/docs/read-standard-input.html

    readln( ) 함수를 사용해 표준 입력을 적용한다. (한 줄을 string으로 읽는다. )

    Copy
    val myCity = readln()
    println(myCity)
    // Siheung
    
    println(readln())
    // 변수에 저장하지 않고 입력 후 바로 출력도 가능하다. 

    toInt( ), toLong( ), toBoolean( ) 등의 함수를 사용하면, 데이터 타입을 변경하는 것도 가능하다.

    이때, 변환함수는 유저가 타겟 데이터 타입에 유효한 값을 입력한다고 가정하기 때문에, 데이터 타입 변환을 할 수 없는 값을 입력할 경우 ( ex : “hello 작성 후 toInt 로 변환 시도 ) exception이 발생한다.

     

    val myAge = readln().toInt()

    .split( ) 함수를 사용해, 구분자를 기준으로 리스트 입력을 받아 특정 타입의 리스트로 반환한다.

     

    val scores = readln().split(' ').map { it.toInt() }  // 1 2 3 입력
    println(scores)  // [1, 2, 3] 
    
    val scoresDouble = readln().split(',').map { it.toDouble() } // 1,2,3 입력
    println(scoresDouble) // [1.0, 2.0, 3.0]

    .toIntOrNull( ) 을 이용해 안전하게 표준 입력을 핸들링할 수 있다.

     

    val notNumber = readln().toIntOrNull()  // I am Yong!
    println(notNumber)   // null
    
    val trueNumber = readln().toIntOrNull() // 2026
    println(trueNumber)  // 2026

    BufferedInputStream + StringBuilder 조합으로 입출력 I/O 시간 줄이기

    참고 :

    https://docs.oracle.com/javase/8/docs/api/java/io/BufferedInputStream.html?utm_source=chatgpt.com (bufferedInputStream)

    https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.text/-string-builder/?utm_source=chatgpt.com (StringBuilder)

    BufferedInputStream의 경우,

    • 생성 시 내부 버퍼 배열 만듬.
    • 필요할 때 여러 바이트를 한 번에 버퍼로 채우고, 그 다음은 메모리에서 소비함.
    • I/O 호출 횟수를 줄이는 효과를 볼 수 있다.

    메모리 (내부에서 버퍼를 만들어 데이터를 저장하고 있음.)와 I/O에 걸리는 시간 사이의 trade-off를 따져, BufferedInputStream을 사용하면 좋을 것 같다.

    kotlin에서 기본적으로 string을 변환하는 연산은 결과를 새 string 객체로 만든다.

     

    ans += "a"
    println(ans)

    StringBuilder의 경우, mutable 문자 시퀀스라, 한 객체에 계속 append가 가능하다.

    매번 새 문자열을 만들지 않고, 내부에 append로 쌓고 마지막에 한 번 toString( ) 으로 출력하면 I/O에 걸리는 시간을 줄일 수 있다.


    고민 : 어떻게 입출력을 작성하면 좋을까?

    바이트처리 vs 문자처리

    BufferedInputStream 또는 BufferedReader(InputStreamReader… )

    바이트 처리 시의 장점이 있겠지만 가독성과 단순한 구현을 고려해, BufferedReader(InputStreamReader)를 사용하기로 했다.

    아래는 n개의 줄에서 두 수가 주어졌을 때 각각의 합을 출력하는 코드를 작성해본 것이다.

     

    import java.io.BufferedReader
    import java.io.InputStreamReader
    import java.util.StringTokenizer
    
    fun main() {
      val br = BufferedReader(InputStreamReader(System.`in`))
      val n = br.readLine().trim().toInt()
      val out = StringBuilder()
      
      repeat(n) {
        val st = StringTokenizer(br.readLine())
        val a = st.nextToken().toInt()
        val b = st.nextToken().toInt()
        out.append(a + b).apppend('\n')
      }
      
      print(out.toString())
    }


    상황에 따라 다른 입력 방법을 사용하게 될 것 같지만, 
    기본적으로 사용할 나만의 템플릿 하나 정도는 가지고 가는 것도 나쁘지 않겠지? 

Designed by Tistory.