머쓱이는 태어난 지 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
}
}
보면서 마음에 들었던 코드
정규표현식이야 몰랐다 쳐도 이걸 생각못한게 아쉽다