설계
옹알이 문자열에서 문자를 하나씩 순회하여 빈 문자열에 삽입
삽입 될 때마다 가능한 옹알이 인지 확인
가능하게 되면 문자열을 비어주고, 인덱스 체크
최종적으로 문자열이 비어있으면 가능 옹알이
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 옹알이에서 벗어날 수 있는가
'알고리즘 & 문제풀이' 카테고리의 다른 글
프로그래머스 - L1 키패드 누르기 (0) | 2023.02.21 |
---|---|
프로그래머스 - L2 예상 대진표 (0) | 2023.02.20 |
프로그래머스 - L2 짝지어 제거하기 (0) | 2023.02.18 |
알고리즘 - Big-O (0) | 2023.02.17 |
프로그래머스 - L2 피보나치 수 (0) | 2023.02.17 |