반응형

백준 1316번 문제입니다. (solved.ac) 기준 실버 5 문제입니다.

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

문제

문제 접근

어렵지 않은 문자열, 구현 문제인 것 같습니다.

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 뜻합니다.
즉 한 번 나온 문자(연속되어도 됨. -ex) aaa, a 등)가 다른 단어를 사이에 두고 또 나오면 그룹 단어가 아니게 됩니다.

예를 들어 aabbcc 는 aa, bb, cc가 연속되어 나왔으면 한 번 등장 후에 a, b가 따로 등장하지 않아 그룹 단어입니다.

하지만 aabbcca 는 앞에서 나온 aa에있는 a가 bbcc 후에 다시 등장했기 때문에 그룹 단어가 아니게 됩니다.

 

이를 이용하여 집합을 사용하였고 한 번 나온 단어는 집합에 집어 넣은 후, 그 단어를 다시 집합에 넣으려고 할 때 false가 반환됩니다.

이는 앞에서 나온 단어가 연속적으로 나온 것이 아닌 별도의 단어를 사이에 두고 나왔다는 뜻이므로 그룹단어가 아니라는 뜻입니다.

단어의 문자를 순차적으로 탐색하여 위와 같은 방법으로 그룹 단어인지 아닌지 판별하도록 하고 그룹 단어의 개수를 출력하도록 하였습니다.

 

정답 코드

fun main(){

    // 단어의 개수
    val n = readln().toInt()

    // 그룹 단어의 개수
    var groupWords = n

    // 단어의 개수만큼 반복
    repeat(n){

        // 단어를 입력 받음
        val word = readln()
        // 단어의 한 글자 한 글자를 저장할 집합
        val charSet = mutableSetOf<Char>()
        // 마지막으로 확인한 글자
        var lastChar = ' '
        // 그룹단어인지 확인할 변수
        var isGroupWord = true

        word.forEach {

            // 직전 단어와 다를 때
            if (lastChar != it) {
                // 마지막으로 확인한 글자를 갱신
                lastChar = it
                // 직전 단어와 다른 단어인데 이미 집합에 포함되어 있다면 그룹단어가 아니라는 뜻.
                if (!charSet.add(it)) isGroupWord = false
            }
        }
        // 그룹단어가 아니라면 그룹단어 개수에서 빼기
        if (!isGroupWord) groupWords--
    }
    // 그룹단어의 개수를 출력
    println(groupWords)
}

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기