[프로그래머스/Kotlin]Level 1 - 옹알이 (2)

2024. 5. 9. 17:12프로그래머스/Kotlin | Level1

728x90
반응형

Level 1 - 옹알이 (2)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

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


나의 풀이

풀이 접근 과정

왠지 replace를 사용하면 여러 예외 케이스에 걸릴 것 같았다.

그래서 발음 array를 따로 만들어서 이걸 순차적으로 돌며 단어의 처음부터 판단하기로 했다.

최종 풀이

class Solution {
    fun solution(babbling: Array<String>): Int {
        var answer = 0

        val tongues = arrayOf("aya", "ye", "woo", "ma")

        fun check(word: String, before: Int): Pair<String, Int> {
            tongues.forEachIndexed { index, s ->
                if (word.startsWith(s)) {
                    if (index != before) {
                        return Pair(word.substring(s.length), index)
                    }
                }
            }
            return Pair(word, -1)
        }

        babbling.forEach {
            var word = it
            var before = -1

            while (true) {
                val checking = check(word, before)
                if (checking.second == -1) {
                    break
                } else if (checking.first.isEmpty()) {
                    answer++
                    break
                } else {
                    word = checking.first
                    before = checking.second
                }
            }
        }

        return answer
    }
}
  1. 입력받은 babbling 배열을 순차적으로 돈다.
  2. 해당 word의 앞글자가 아기가 발음할 수 있고, 연속되지 않는다면 그 발음을 지워준다.
  3. 그렇게 순차적으로 지우다가 발음할 수 없는 값인 경우나 연속되는 발음인 경우 반복문에서 빠져나온다.
  4. 다 지웠을 때 값이 “” 상태이면 answer를 더해준다.

다른 사람의 풀이

풀이 1

class Solution {
    fun solution(babbling: Array<String>) = babbling.count { it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }
}
  1. babbling.count { ... } 부분은 배열의 각 요소에 대해 주어진 조건을 만족하는 요소의 개수를 세는 역할을 한다. 여기서 중괄호 내부의 코드는 각 요소가 주어진 패턴을 만족하는지 확인하는 람다 함수이다.
  2. it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) 부분은 정규 표현식을 사용하여 문자열이 주어진 패턴을 만족하는지 확인한다.
    • ^: 문자열의 시작
    • (: 그룹 시작
      • aya(?!aya): "aya"로 시작하지만 그 뒤에 "aya"가 오지 않는 문자열
      • |: 또는
      • ye(?!ye): "ye"로 시작하지만 그 뒤에 "ye"가 오지 않는 문자열
      • |: 또는
      • woo(?!woo): "woo"로 시작하지만 그 뒤에 "woo"가 오지 않는 문자열
      • |: 또는
      • ma(?!ma): "ma"로 시작하지만 그 뒤에 "ma"가 오지 않는 문자열
    • )+: 그룹이 하나 이상 반복되는 것을 의미합니다.
    • $: 문자열의 끝

풀이 2

class Solution {
    fun solution(babbling: Array<String>): Int = babbling.filter {
        !it.contains("ayaaya|yeye|woowoo|mama".toRegex())
    }.map { 
        it.replace("aya|ye|woo|ma".toRegex(),"")
    }.filter { it.isEmpty() }.size 
}
  1. 발음이 연속되는 값을 포함하지 않는 단어만 필터링한다.
  2. 필터링 된 단어에서 aya와 ye, woo, ma를 “”로 replace한다.
  3. 최종적으로 만들어진 단어 중 “” 인 값의 개수를 리턴한다.

Comment

나는 정답을 빙빙 돌아가서 푼 것 같다.

어렵게 접근했다.

좀 더 간단하게 풀 수 있었는데, 살짝 아쉽다.

728x90
반응형