성장, 그 아름다운 향연

 

www.acmicpc.net/problem/10820

 

10820번: 문자열 분석

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있

www.acmicpc.net

 

문제

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.

각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.

입력

첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.

출력

첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.

 

 


 

처음 문제를 접할 때 구현하는 방법은 크게 어렵지 않았지만 별다른 종료 조건이 없어서 상당히 난감했다.

 

질문 검색란을 살펴보면서 EOF라는 개념을 알게 됐고, 코딩 테스트 문제에서 종료 조건이 따로 명시되지 않았을 때 해당 방법을 이용하면 됨을 알 수 있었다.

 

 

EOF란?

: End Of File의 줄임말로써, 말 그대로 파일의 끝을 나타내는 코드이다.

  java나 kotlin에서는 입력받는 코드가 null일 때 적용된다.

(개행을 뜻하는 '\n' 이나 공백은 하나의 문자로 간주하기 때문에 EOF로 사용하면 안된다.)

  

 

 

JAVA같은 경우에는

 

BufferReader br = new BufferReader(new InputStreamReader(System.in));
String str = "";

while((str=br.readLine()) != null) {

...

}

 

와 같이 while문 안에 str에 값을 대입하는 꼴이 가능하지만 코틀린에서는 해당 문법을 허용하지 않았다.

 

 

 

그래서 찾은 해답은 엘비스(elvis) ?: 를 이용하기로 했다.

 

while(true) {
	val str : String = br.readLine() ?: break
}

 

코틀린에서는 변수의 자료형을 선언할 때, 기본적으로 null이 아님을 보장하기 위해 null check를 따로 하지 않는다.

이에 반해 엘비스 연산자는 어떤 값을 할당할 때,

만약 null이라면 엘비스 연산자 우측의 명령문을 실행하고, null이 아니라면 우측의 명령문을 스킵한다.

 

 

 

 

 

 

 

전체 코드는 다음과 같다.

 

import java.io.*

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    while (true) {
        val str = br.readLine() ?: break
        var a = 0
        var b = 0
        var c = 0
        var d = 0

        for (i in str) {
            when(i) {
                in 'a'..'z' -> a++
                in 'A'..'Z' -> b++
                in '0'..'9' -> c++
                ' ' -> d++
            }
        }
        bw.write("$a $b $c $d\n")
    }
    bw.flush()
    bw.close()
    br.close()
}
profile

성장, 그 아름다운 향연

@dev_minoflower

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...