본문 바로가기

알고리즘 & 문제풀이

프로그래머스 - L1 옹알이 (2)

설계

옹알이 문자열에서 문자를 하나씩 순회하여 빈 문자열에 삽입

삽입 될 때마다 가능한 옹알이 인지 확인

가능하게 되면 문자열을 비어주고, 인덱스 체크

최종적으로 문자열이 비어있으면 가능 옹알이

git : 옹알이 (2)

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/133499


문제 풀이

possibleBabble 가능한 옹알이를 상수 배열 선언

babble.reduce( …. ) 문자를 하나씩 순회하면서 문자를 더 해나간다. 가능한 옹알이 단어 일 경우 문자열을 빈 문자열로 초기화, 인덱스 저장해놓기

결과적으로 문자열이 비어있으면 가능한 옹알이

let possibleBabble = ["aya", "ye", "woo", "ma"]

func solution(_ babbling:[String]) -> Int {
    
    let filterBabbling = babbling.filter{item in
        return isPossible(babble: item)
    }
    
    return filterBabbling.count
}

func isPossible(babble: String) -> Bool {
    
    var preIndex = -1
    
    var babbles = babble.reduce("", { preResult, item in
        var tempResult = preResult + String(item)
        if let index = possibleBabble.firstIndex(of: tempResult) {
            if(preIndex != index) {
                preIndex = index
                tempResult = ""
            }
        }
        return tempResult
    })
    
    return babbles.isEmpty
}

foreach, reduce, map 고차함수 유용한데, for 문과 같이 특이 조건에 break는 불가능한거겠죠? gpt한테 물어봐야겠습니다.

사실 preIndex == index 인 경우 더 이상 처리가 필요하지 않은데, 어쨋든 끝까지 순회하게 되네요..

다른 사람 풀이 분석

프로그래머스 - 이승언 님

func solution(_ babbling:[String]) -> Int {
    var count: Int = 0
    for element in babbling {
        var str = String(element)
        str = str.replacingOccurrences(of: "aya", with: "1")
        str = str.replacingOccurrences(of: "ye", with: "2")
        str = str.replacingOccurrences(of: "woo", with: "3")
        str = str.replacingOccurrences(of: "ma", with: "4")
        if Int(str) != nil && !str.contains("11") && !str.contains("22") && !str.contains("33") && !str.contains("44"){
            count += 1
        }
    }    
    return count
}

문자를 치환하여 확인 할 수도 있겠네요. 시간의 효율성 측면에서는 n^2로 비슷한거 같습니다?!?

정리

난 언제 swift 옹알이에서 벗어날 수 있는가