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

Kotlin] 백준 1316번 문제풀이

by 김마리님 2023. 6. 9.

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

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

 

풀이

더보기

이 문제는.. 내 풀이가 최선이란 생각이 도저히 들진 않지만.

이 문제의 핵심은, 그래서 앞서 나온 알파벳이 저 뒤에 다시 나오지 않는지 체크해야한다. 단, 함께 붙어나온다면 예외로 친다.

 

내가 선택한 방식은 

1. 새 문자열을 만든다

2. 입력받은 문자열의 글자크기만큼 반복하여, 새 문자열의 뒷 공백을 trim으로 날리고 만나는 마지막 문자와 현재 인덱스의 문자가 일치한다면 새 문자열에 공백을 추가하고, 아니라면 해당 문자를 추가한다.

 

이렇게 하면 반복되는 문자를 삭제처리함으로써, 나중에 replace(" ", "")로 없앨 수 있다.

이 작업이 끝났다면 만들어진 새 문자열의 replace(" ", "")하고, 공백이 사라진 문자의 크기와 원래 문자를 charArray로 변경하여 distinct() (배열에서 중복되는 원소를 삭제)하고 남은 배열의 크기를 비교하여 같다면 그룹문자로 취급하고, 아니라면 뒤에서 다시 아전에 쓰인 알파벳이 등장했다는 의미이므로 그룹문자가 아니라고 판단한다.

 

이를 코드로 보면

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

fun question1316() {
    var case = readLine()!!.toInt()
    var count = 0
    for (i in 1 .. case) {
        var word = readLine()!!

        var newWord = ""
        for(j in word.indices) {
            if(j == 0) {
                newWord += word[j]
            } else {
                if(word[j] == newWord.trim().last()) {
                    newWord += " "
                } else {
                    newWord += word[j]
                }
            }
        }

        if(newWord.replace(" ","").length == word.toCharArray().distinct().count()) {
            count += 1
        }
    }

    println(count)
}
반응형