[프로그래머스 LV1] 옹알이 (2)

Junyoung Park·2022년 11월 30일
0

코딩테스트

목록 보기
629/631
post-thumbnail

1. 문제 설명

옹알이 (2)

2. 문제 분석

  • 이넘을 통해 말할 수 있는 단어 케이스를 지정, 연산 프로퍼티를 통해 각 단어로 생성되는 문자열 배열을 리턴
  • 이전 시점에 언급한 단어를 currentWord로 가지면서 주어진 단어를 모두 말할 때까지(즉 주어진 단어가 사라질 때까지) 반복. 스위프트에서 문자열 자체 서브스크립트가 다루기 불편한 까닭에 문자열의 배열로 변환해서 확인하고 있다.
  • 주어진 단어의 문자열 개수가 비교하려는 단어의 개수 이상이고, 매칭이 되고, 이전에 말한 단어가 아닐 때에만 비로소 발음이 가능하다. 주어진 문자를 전체 문자열 배열에서 제거하고, 이전에 발음한 단어를 체크해주자.

3. 나의 풀이

import Foundation

func solution(_ babbling:[String]) -> Int {
    var answer = 0
    for babble in babbling {
        if isSpeakable(word: babble) {
            answer += 1
        }
    }
    
    return answer
}

enum Words: String, CaseIterable {
    case aya
    case ye
    case woo
    case ma
    
    var arrayString: [String] {
        return rawValue.map({String($0)})
    }
}

func isSpeakable(word: String) -> Bool {
    var word = word.map({String($0)})
    var currentWord: Words?
    while !word.isEmpty {
        guard let letter = word.first else { break }
        switch letter {
        case "a":
            if word.count >= 3 && word[0..<3].map({$0}) == Words.aya.arrayString && currentWord != .aya {
                for _ in 0..<3 {
                    word.removeFirst()
                }
                currentWord = .aya
            } else {
                return false
            }
        case "y":
            if word.count >= 2 && word[0..<2].map({$0}) == Words.ye.arrayString && currentWord != .ye {
                for _ in 0..<2 {
                    word.removeFirst()
                }
                currentWord = .ye
            } else {
                return false
            }
        case "w":
            if word.count >= 3 && word[0..<3].map({$0}) == Words.woo.arrayString && currentWord != .woo {
                for _ in 0..<3 {
                    word.removeFirst()
                }
                currentWord = .woo
            } else {
                return false
            }
        case "m":
            if word.count >= 2 && word[0..<2].map({$0}) == Words.ma.arrayString && currentWord != .ma {
                for _ in 0..<2 {
                    word.removeFirst()
                }
                currentWord = .ma
            } else {
                return false
            }
        default: return false
        }
    }
    return true
}
profile
JUST DO IT

0개의 댓글