🕵️문제설명

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

⚠️제한사항

1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 30
문자열은 알파벳 소문자로만 이루어져 있습니다.

🔎로직설명

내 코드

fun solution(babbling: Array<String>): Int {
    val say = arrayOf("aya","ye", "woo", "ma")
    var count = 0
    babbling.forEach {
        var a = it
        var lastSay = ""
        var valid = true

        while (a.isNotEmpty() && valid) {
            valid = false
            for (sound in say) {
                if (a.startsWith(sound) && sound != lastSay) {
                    a = a.removePrefix(sound)
                    lastSay = sound
                    valid = true
                    break
                }
            }
        }

        if (a.isEmpty()) {
            count++
        }
    }

    return count
}

바블링 안의 요소를 변수 a에 넣고 마지막으로 말한 말 초기화

a가 빌때까지 반복문을 돌린다

조건문을 사용해서 a가 sound로 시작하면서 sound가 직전에 말한 단어가 아닐때

removePrefix를 사용해 a에 접두사 sound를 지워준다

lastSay에 값을 넣어주고 break로 for문을 탈출한다

그 다음 다시 for문이 반복되고

a를 계속 제거해준다

제거 할게 없으면 for문이 전부 끝난 뒤 valid가 false가되 반복문이 끝난다

그런다음 a가 전부 제거되어 비어있으면 count를 올린다

다른사람 코드


    fun solution(병신소리: Array<String>) = 병신소리.count {
    it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }

정규 표현식을 이용해서 풀었다.

정규 표현식(Regular Expression 또는 Regex)은 문자열 패턴을 정의하는 데 사용되는 강력한 도구
특정 문자열 패턴을 검색하거나 추출하는 등의 문자열 처리 작업을 효과적으로 수행할 수 있다.

babbling을 카운트하고 요소를 정규 표현식에 matches시킨다

^(문자열 시작) ?!(일치하는 지점 다음 특정 패턴이 나오면안됨) ye(?!ye) ye다음 ye가 나오면 안됨

|는 or '+'는 앞의 그룹이 최소 한번 이상 반복되야 한다 $는 문자열의 끝 toRegex()는 정규표현식을 다루기 위한 클래스

Regex 클래스는 다음과 같은 주요 메서드를 제공합니다:

  • matches(input: CharSequence): Boolean: 주어진 입력 문자열이 정규 표현식과 일치하는지 여부를 반환합니다.

  • find(input: CharSequence): MatchResult?: 주어진 입력 문자열에서 첫 번째로 매치되는 부분을 찾아 MatchResult 객체로 반환합니다. 만약 매치되는 부분이 없으면 null을 반환합니다.

  • findAll(input: CharSequence): Sequence: 주어진 입력 문자열에서 매치되는 모든 부분을 찾아 Sequence로 반환합니다.

  • replace(input: CharSequence, replacement: String): String: 주어진 입력 문자열에서 정규 표현식과 일치하는 부분을 지정된 문자열로 대체합니다.

  • 그 외에도 다양한 메서드들이 있습니다.

class Solution {
    fun solution(babbling: Array<String>): Int {
        var answer: Int = 0
        var regex = "aya|ye|woo|ma".toRegex()
        var regexC = "ayaaya|yeye|woowoo|mama".toRegex()
        answer = babbling.map{it.replace(regexC,"*")}.map{it.replace(regex,"")}.filter { it =="" }.size
        return answer
    }
}

이것도 정규 표현식을 썻는대 반복되는 문자열은 regexC로하고 애기 소리를 regex로 정의

babbling을 매핑한다음 반복되는 부분은 regex가 없애지 못하게 *로 구분해줬고 애기소리를 ""으로 바꿔서 filter로 ""을 구분하고 그 크기를 리턴했다.

class Solution {
   fun solution(babbling: Array<String>): Int {
       var count = 0
       babbling.forEach { word ->
           var replace = word.replace("ayaaya", "?")
                             .replace("yeye", "?")
                             .replace("woowoo", "?")
                             .replace("mama", "?")
                             .replace("aya", "-")
                             .replace("ye", "-")
                             .replace("woo", "-")
                             .replace("ma", "-")

           if (replace.all{it == '-' })
               count++
           println("$replace, $count")
       }


       return count        
   }
}

보면서 마음에 들었던 코드

정규표현식이야 몰랐다 쳐도 이걸 생각못한게 아쉽다

0개의 댓글