본문 바로가기
스터디(beakjoon)

Kotlin] 백준 2941번 문제풀이

by 김마리님 2023. 6. 9.

https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

 

풀이

더보기

이 풀이는 알파벳이 몇 개 쓰였냐, 세는 문제인데... 문제라면 크로아티안 문자가 1개 이상의 글자로 이루어졌다는 점이다.

따라서 단순히 charArray() 로 나누는 것은 의미가 없고.. 그렇다면 문자에서 해당 글씨를 찾아서 세는 법밖에 없다.

먼저 치환 문자를 저장한 array를 생성하고, 해당 배열을 반복하여 문장에서 해당 문자가 있는지 찾는 수 밖에 없다. 

 

그렇기에 해당 문자열이 존재하는지 확인했다면  index를 사용하며, index가 -1이 아니라면 카운트를 1 올리고, 가장 첫 번째의 해당 알파벳을 삭제한다(이 알파벳은 셈을 했기 때문). 이 알파벳이 수없이 존재할 수 있으므로 while문을 통해 index가 -1이 될 때까지 반복한다.

이 때 단순히 ""로 치환하는 것이 아닌, " "(공백)치환을 해야하는데, 반례로서 cc--가 있다.  이 케이스의 경우 "" 치환을 하게 되면 c-를 날리게 될 경우, 남는 문자열이 다시 c-가 되므로, 실제적으론 3개의 알파벳이나, 다음 반복문에서는 c-가 남는 것처럼 보이므로 한번 더 세어버리기 때문에 c-를 치환했을 때 c -로 변경되며 다음 문자열을 안전하게 통과할 수 있다.

 

마지막으로 크로아티안 알파벳이 날아간 문자열의 공백을 replace(" ", "")함으로써 공백을 제거하고 문자열의 길이를 계산하여 남은 알파벳의 갯수를 센다.

 

fun main(args: Array<String>) {
    question2941()
}

fun question2941() {
    var word = readLine()!!
    var croatian = arrayOf("c=", "c-", "dz=", "d-", "lj", "nj", "s=" ,"z=")
    // 카운트
    var count = 0

    croatian.forEach {
        if(word.contains(it)) {
            while (true) {
                var index = word.indexOf(it)
                if(index == - 1) {
                    break
                } else {
                    count += 1
                    word = word.replaceFirst(it, " ")
                }
            }
        }
    }

    count += word.replace(" ", "").toCharArray().count()
    println(count)

}
반응형