백준

EOF의 이해

문코더 2023. 7. 31. 11:53
728x90

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1

1 1
2 3
3 4
9 8
5 2

예제 출력 1

2
5
7
17
7

풀이


이 문제의 핵심은 EOF를 감지하고 반복문을 탈출 하는 것 이었다..

여기서 EOF(End of File)는 파일 또는 입력 소스에서 더 이상 읽을 데이터가 없음을 나타내는 신호이다.

해당 코드에서는

if (input == null|| input.*isBlank*())이 부분을 통해 EOF를 감지하고 무한루프를 탈출 하도록 설계하였다.

입력이 없이 엔터키만 입력해 빈 줄이 있는 경우 **NumberFormatException**이 발생하는 오류가 있었는데, val (A, B) = input.split(" ").map { it.toIntOrNull() ?:0} 이 코드에서 입력이 없거나 빈 줄일 경우를 고려하여 숫자 변환을 수행하여 오류를 잡았습니다.

fun main() {

        val emptyArray : Array<Int> = Array(100){0}
        var i =0
        while(true) {
            val input = readLine()
            if (input == null|| input.isBlank()) {
                break
            }
            val (A, B) = input.split(" ").map { it.toIntOrNull()  ?:0}
            emptyArray[i] = A + B
            i++
        }
    for(j:Int in 0 until i) {
        println(emptyArray[j])
    }

}

toIntOrNull() 함수는 문자열을 정수로 변환하려고 시도하고, 변환이 실패할 경우에는 **null**을 반환합니다. 그래서 입력이 없는 경우, 즉 빈 문자열이나 공백 문자열을 입력하면 **split(" ")**를 통해 빈 리스트가 생성되고, **map { it.toIntOrNull() ?: 0 }**에서 모든 요소는 **null**로 변환됩니다.

즉 입력이 없는 경우에는 빈 리스트가 생성되고 모든 요소가 **null**로 변환되며, input.*isBlank*() 조건문이 참이 되어 무한 루프를 탈출하게 됩니다.