코틀린 문법 - 입력값 처리

kimgwon·2024년 6월 26일

Kotlin

목록 보기
1/19
post-thumbnail

🫧 Scanner vs BufferedReader

알고리즘 문제를 풀 때, 대부분 Scanner와 BufferedReader를 이용한다.
둘의 차이와 장단점을 알아보자.

🫧 Sanner

Scanner 클래스는 Java의 유틸리티 클래스 중 하나로, 다양한 데이터 타입의 입력을 쉽게 처리할 수 있게 해준다.
Scanner는 공백을 기준으로 입력을 분할하여 처리한다.

일반적으로 스캐너를 이용할 때 다음과 같이 사용한다.

fun main(args: Array<String>) = with(Scanner(System.`in`)) {
	val intValue = nextInt()
    val stringValue = next()
    val lineValue = nextLine()

nextInt() : 정수를 입력받는다.
next() : 공백으로 구분된 문자열을 입력받는다.
nextLine() : 한 줄의 텍스트를 입력받는다.

✏️ 장점

  • nextInt(), nextLine() 등을 통해 입력 받은 값의 자료형을 손쉽게 지정할 수 있다.

✏️ 단점

  • 키보드의 입력을 바로바로 전송하는 원리이기 때문에 속도가 느리다.

🫧 BufferedReader

BufferedReader는 Java의 I/O 클래스 중 하나이다.
BufferedReader는 입력을 버퍼링하여 효율적으로 읽어올 수 있다.
주로 한 줄 단위로 입력을 처리할 때 사용된다.

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
	val intValue = readline().toInt()
    val stringValue = readLine()
    val lineValue = readLine()

Scanner에서는 입력받는 문자열을 nextInt()로 바로 가공할 수 있었지만 BufferedReader는 readLine()만 사용할 수 있다. 따라서 무조건 String 자료형으로만 받아올 수 있다.
따라서 Integer 형태로 다시 변환해주는 코드가 늘어나게 되는 단점이 있다.

아래와 같은 입력값을 처리하는 방법을 알아보자.

10 20 30 40 50

BufferedReader에서 띄어쓰기로 구분된 Integer를 가공하려면 StringTokenizer를 사용해야 한다.

import java.util.StringTokenizer

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
	val arr = ArrayList<Int>()
    val st = StringTokenizer(readLine())
    
    while(st.hasMoreTokens()) {
    	arr.add(st.nextToken().toInt())
    }
}

✏️ 장점

  • 버퍼에 저장해놓고 전송하는 방식이기 때문에 빠르다.

✏️ 단점

  • 많은 보일러 플레이트 코드가 존재한다.
    보일러 플레이트 코드

    최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드

  • 경우에 따라 StringTokenizer를 사용해야 한다.

🫧 무엇을 사용해야 할까?

BufferedReader를 추천한다. 프로그램에서는 효율성이 중요하기 때문이다.


🫧 알고리즘 문제 풀 때 꿀팁

✨ BufferedReader 더 간결하게 선언하기

BufferedReader를 선언할 때 대부분 아래와 같을 것이다.

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
	val name = readLine()
    val age = readLine().toInt()

readln()을 통해 더 간결하게 구현할 수 있다. readln()을 사용하면 with 스코프 함수를 안써도 된다.

fun main(args: Array<String>) {
	val name = readln()
    val age =  readln().toInt()

✨ 람다식을 사용하여 더 간결하게 작성하기

x축, y축을 입력받아 가공하는 프로그램을 작성한다고 해보자.
첫 줄에는 점의 개수, 그 다음줄 부터는 x좌표, y좌표를 차례대로 입력받는다.

4
0 0
0 1
3 4
5 7

StrinTokenizer를 사용하지 않고 람다식으로 간결하게 표현할 수 있다.

fun main(args: Array<String>) {
	val n = readln().toInt()
    val dots = ArrayList<Dot>()
    repeat(n) {
    	val (x, y) = readln().split(" ").map {it.toInt()}
        dots.add(Dot(x, y))
    }
}

data class Dot(val x: Int, val y: Int)


Reference

https://velog.io/@blucky8649/코틀린-코틀린에서의-입력값-처리-방법-feat.-알고리즘-문제풀이-꿀팁

0개의 댓글