https://school.programmers.co.kr/learn/courses/30/lessons/133499
가능한 옹알이 조합(4!=24개) 리스트를 모두 작성해놓고 필터 때리면 되지 않나?였다.
근데 그러면 좀... 멋이 안 나잖아요... 브루트 포스로 암호해독하는 그런 느낌...
그래서 다른 방법을 생각했고,
각 스트링에서 옹알이들을 한 번씩 빼면,
빈 스트링이 있을 것인데, 그게 발음할 수 있는 단어의 개수 아닌가?
일단 가능한 옹알이 단어들을 상수로 선언해줬다.
let speakableWords = ["aya", "ye", "woo", "ma"]
그리고 결과를 담을 변수에 일단 인풋 옹알이를 담아줬다.
var result = babbling
그 다음에, speakableWords에서 ForEach를 이용해 하나씩 돌면서,
result의 각 요소들을 map 함수를 이용해 변형시켜줬다. (speakableWord에 있는 단어면 공백으로)
근데 이제 String의 .replacingOccurrences(of:) 메소드를 이용해서!
speakableWords.forEach { word in
result = result.map { $0.replacingOccurrences(of: word, with: "") }
}
import Foundation
func solution(_ babbling:[String]) -> Int {
let speakableWords = ["aya", "ye", "woo", "ma"]
var result = babbling
speakableWords.forEach { word in
result = result.map { $0.replacingOccurrences(of: word, with: "") }
}
return result.filter { $0 == "" }.count
}
근데 안됨.
왜 안됐냐?
문제에서 같은 옹알이를 두번 반복하는 것은 안된다고 해서다.
그니까 "ye"는 발음이 되는데 "yeye"는 안된다는소리... 이게말이나되는소리인가
않이...
일단 replacingOccurrences(of: word, with: "")에서 공백으로 바꾸지 않고,
speakableWords의 인덱스를 String으로 바꿔서 그걸 넣어줄 생각이다.
그러면 일단 구분이 되겠지...
그래서 이 코드를,
speakableWords.forEach { word in
result = result.map { $0.replacingOccurrences(of: word, with: "") }
}
이렇게 바꿨다.
for (index, word) in speakableWords.enumerated() {
result = result.map { $0.replacingOccurrences(of: word, with: String(index)) }
}
그랬더니 일단 생각한대로 됐다.
반복이 안되면 "ayayeaya"는 되는건가요??
네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
몰라일단코드때려넣고본다.
import Foundation
func solution(_ babbling:[String]) -> Int {
let speakableWords = ["aya", "ye", "woo", "ma"]
let restrictedCombo = ["00", "11", "22", "33"]
var result = babbling
for (index, word) in speakableWords.enumerated() {
result = result.map { $0.replacingOccurrences(of: word, with: String(index)) }
}
result = result.filter { !restrictedCombo.contains($0) }
result = result.map { $0.omitNumerics }
return result.filter { $0 == "" }.count
}
extension String {
var omitNumerics: String {
components(separatedBy: CharacterSet.decimalDigits)
.joined()
}
}
스트링에서 숫자들만 따로 분리할 수 없나 찾아보다가,
요런 유용한 스트링에서 숫자를 제외한 것들을 없애주는 익스텐션 코드를 발견했다.
extension String {
var omitNumerics: String {
components(separatedBy: CharacterSet.decimalDigits)
.joined()
}
}
나중에도 유용하게 쓸 것 같으니 메모...
CharacterSet.decimalDigits...!
https://stackoverflow.com/questions/29971505/filter-non-digits-from-string
알고보니 0100같은 조합이 안 걸러진 것...
그러니까, restrictedCombo에 ["00", "11", "22", "33"] 넣어놨는데,
"0100" != "00" 이라서, (두 개가 다른 스트링이잖아요...!)
result.filter { !restrictedCombo.contains($0) }
로 걸러지지 않은 것입니다.
그래서 뭐... 또 리트라이해야죠...
import Foundation
func solution(_ babbling:[String]) -> Int {
let speakableWords = ["aya", "ye", "woo", "ma"]
let restrictedCombo = ["00", "11", "22", "33"]
var result = babbling
for (index, word) in speakableWords.enumerated() {
result = result.map { $0.replacingOccurrences(of: word, with: String(index)) }
}
for word in restrictedCombo {
result = result.map { $0.replacingOccurrences(of: word, with: "/") }
}
result = result.map { $0.omitNumerics }
return result.filter { $0 == "" }.count
}
extension String {
var omitNumerics: String {
components(separatedBy: CharacterSet.decimalDigits)
.joined()
}
}
restrictedCombo 문자열들을 죄다 "/"으로 변경해주고
그 결과물에서 모든 숫자들을 걸러내는 방식으로 변경했습니다.
그럼? 빈 스트링이 가능한 조합이겠죠?
그래서 성공했을까요?
ㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱㄷㄱ
예압.
extension String {
var omitNumerics: String {
components(separatedBy: CharacterSet.decimalDigits)
.joined()
}
}
요녀석!
옹알왱알 이후로 포스팅이 안올라옵니다 선생님 심지어 이거 언젠가 풀 건데 스포 당할까봐 내용을 읽지도 못하고 내렸어야 했어요