머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
1차 풀이
func solution(_ babbling:[String]) -> Int {
let possiblePronounciation = ["aya", "ye", "woo", "ma"]
var babblings = babbling, result = 0, isSame = false, cnt = 0, trash = ""
for i in 0..<babblings.count {
for j in 0..<possiblePronounciation[i].count {
for k in 0..<Array(arrayLiteral: possiblePronounciation[i])[j].count {
if Array(babblings[i])[k] == Array(possiblePronounciation[j])[k] {
cnt += 1
}
else if cnt == k {
}
}
}
}
return result
}
이 코드로 해결이 되었으면 얼마나 좋았을까... 하지만 전혀 해결할 수 없었다. 딱봐도 안될거같은 코드다.
입력으로 받은 옹알이 문자열의 맨 앞에서부터 발음할 수 있는 문자열과 비교해서, 같으면 해당 문자열 부분을 삭제하는 코드를 옹알이 문자열이 빌 때까지 반복하는 알고리즘으로 코드를 작성하려 했던 것이다.
이런 방식으로 문제를 해결하려고 NSString, String Document를 싹 뒤져보고 이렇게 저렇게도 사용해봤지만, 문제가 해결이 되지 않았다. 덕분에 replacingOccurrences() 메소드가 어떻게 작동하는지 알아낸 것은 좋았지만, 문제가 해결되지 않으니 엄청 스트레스였다.
도저히 답을 모르겠어서 보니, 위에서 말한 replacingOccurrences() 메소드를 사용하면 해결이 가능할 것 같아서 코드를 작성해봤다.
func solution(_ babbling: [String]) -> Int {
var pronounce = ["aya", "ye", "woo", "ma"], temp = " ", result = 0
for i in 0..<babbling.count {
temp = babbling[i]
for j in 0..<pronounce.count {
temp = temp.replacingOccurrences(of: pronounce[j], with: "\(j)")
}
if let answer = Int(temp) {
if !String(answer).contains("00") && !String(answer).contains("11") && !String(answer).contains("22") && !String(answer).contains("33") && String(answer) != "" {
result += 1
}
}
}
return result
}
이런 식으로 코드를 작성해서 프로그래머스 사이트에서 답변을 제출했더니 파란 글씨로 정답!!!! 이라고 쫘라라라라락 뜨다가 테스트케이스 13번에서 하나 빨간불이 딱!! 떴다. 이걸 해결하려고 또 이런 저런 조건을 추가하다가 어떤 식으로 오류를 잡아야 할 지 감이 잡히지 않아서 다른 선배님이 작성하신 정답과 비교를 막... 해보는 시간을 가졌다.
func solution(_ babbling:[String]) -> Int {
var result = [String]()
var count = 0
for babble in babbling {
result.append(
babble.replacingOccurrences(of: "aya", with: "1")
.replacingOccurrences(of: "ye", with: "2")
.replacingOccurrences(of: "woo", with: "3")
.replacingOccurrences(of: "ma", with: "4")
)
}
for now in result{
if let replacing = Int(now){
if !String(replacing).contains("11") && !String(replacing).contains("22") && !String(replacing).contains("33") && !String(replacing).contains("44"){
count += 1
}
}
}
return count
}
이 코드로 제출하니 13번 테스트 케이스도 해결이 되었다.
아마 문제가 된 부분은, 입력으로 빈 문자열이 들어왔을 때 같다. 아직 어떤 부분이 정확히 에러를 초래하는 지 잘 모르겠지만, 알게 된다면 업데이트하도록... 할 것이다.
오늘 공부는 이 한 문제로 다 했다. 고생했다 멍청한 나!!