Algorithm / 옹알이(2)

알고리즘 코드카타

목록 보기
15/59

1) 문제

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

2) 문제 풀이

func solution(_ babbling:[String]) -> Int {
    let words = ["aya", "ye", "woo", "ma"]
    
    let count = babbling.map {
        var result: String = $0

        for word in words {
            
            if result.contains(word + word), let range = result.range(of: word) {
                result = result.replacingCharacters(in: range, with: " ")
            } else {
                result = result.replacingOccurrences(of: word, with: " ")
            }
            
        }
        
        result = result.replacingOccurrences(of: " ", with: "")

        return result.count
        
    }.filter { $0 == 0 }.count
    
    return count
}

결과

3) 코드 개선

  • if result.contains(word + word)를 체크하지만, 실제로는 연속된 같은 단어가 포함되기만 해도 첫 번째 등장하는 단어만 지우는 문제
  • 공백" "으로 바꾸고 다시 공백" "을 제거하는 로직의 불필요함
  • range(of:)word + word에 대한 range가 아닌 word의 첫 등장 위치만 지우게 되어 정확하지 않음
func solution(_ babbling: [String]) -> Int {
    let words = ["aya", "ye", "woo", "ma"]
    var count = 0

    for babble in babbling {
        var temp = babble
        var last = ""
        var isValid = true

        while !temp.isEmpty {
            var matched = false

            for word in words {
                if temp.hasPrefix(word) {
                    if last == word {
                        isValid = false
                        break
                    }

                    temp.removeFirst(word.count)
                    last = word
                    matched = true
                    break
                }
            }

            if !matched {
                isValid = false
                break
            }
        }

        if isValid {
            count += 1
        }
    }

    return count
}
  • hasPrefix를 이용해 문자열 앞부분부터 순차적으로 검사
  • 직전 사용한 단어(last)를 기억해서 중복 방지
  • 일치하는 단어가 없으면 바로 무효 처리
  • 반복문과 조건을 분리해서 가독성을 높임

결과

profile
이유있는 코드를 쓰자!!

0개의 댓글