Level 1 - 옹알이 (2)
문제
머쓱이는 태어난 지 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
}
}
- 입력받은 babbling 배열을 순차적으로 돈다.
- 해당 word의 앞글자가 아기가 발음할 수 있고, 연속되지 않는다면 그 발음을 지워준다.
- 그렇게 순차적으로 지우다가 발음할 수 없는 값인 경우나 연속되는 발음인 경우 반복문에서 빠져나온다.
- 다 지웠을 때 값이 “” 상태이면 answer를 더해준다.
다른 사람의 풀이
풀이 1
class Solution {
fun solution(babbling: Array<String>) = babbling.count { it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }
}
- babbling.count { ... } 부분은 배열의 각 요소에 대해 주어진 조건을 만족하는 요소의 개수를 세는 역할을 한다. 여기서 중괄호 내부의 코드는 각 요소가 주어진 패턴을 만족하는지 확인하는 람다 함수이다.
- 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
}
- 발음이 연속되는 값을 포함하지 않는 단어만 필터링한다.
- 필터링 된 단어에서 aya와 ye, woo, ma를 “”로 replace한다.
- 최종적으로 만들어진 단어 중 “” 인 값의 개수를 리턴한다.
Comment
나는 정답을 빙빙 돌아가서 푼 것 같다.
어렵게 접근했다.
좀 더 간단하게 풀 수 있었는데, 살짝 아쉽다.
'프로그래머스 > Kotlin | Level1' 카테고리의 다른 글
[프로그래머스/Kotlin]Lv1 - 부족한 금액 계산하기 (0) | 2024.07.17 |
---|---|
[프로그래머스/Kotlin]Lv1 - 명예의 전당(1) (0) | 2024.07.11 |
[프로그래머스/Kotlin]Level1 - 개인정보 수집 유효기간 (0) | 2024.05.03 |
[프로그래머스/Kotlin]Lv1 - 신고 결과 받기 (0) | 2023.06.10 |
[프로그래머스/Kotlin]Level1 - 소수 만들기 (0) | 2023.02.23 |