https://www.acmicpc.net/problem/2941
풀이
더보기
이 풀이는 알파벳이 몇 개 쓰였냐, 세는 문제인데... 문제라면 크로아티안 문자가 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)
}
반응형
'스터디(beakjoon)' 카테고리의 다른 글
Kotlin] 백준 25206번 문제풀이 (0) | 2023.06.12 |
---|---|
Kotlin] 백준 1316번 문제풀이 (1) | 2023.06.09 |
Kotlin] 백준 1157번 문제풀이 (0) | 2023.06.08 |
Kotlin] 백준 4344번 문제풀이 (0) | 2023.06.08 |
Kotlin] 백준 2444번 문제풀이 (1) | 2023.06.07 |