TIL/알고리즘 공부
프로그래머스 Lv. 1 Swift 알고리즘 - 옹알이(2)
여의도사노비
2022. 12. 30. 15:55
728x90
이 문제는 특정 단어들을 찾아내고 그 값을 조합할 수 있느냐를 물어보는 문제이다.
문제를 보자마자 replacingOccurences가 생각났지만... 아무래도 해당 함수가 소요시간이 꽤 걸리는 함수이다 보니, 이번에는 최대한 이거말고 다른 방향으로 풀어보고자했다. 그런데 답이 안나와서... 결국 relacingOccurences를 사용했다..ㅎㅎ
이 문제를 풀면서 생각한 논리적 흐름
- 알고리즘을 풀면서 굉장히 중요하게 느낀 것은 예외사항을 빠르게 쳐내주는 것이었다.
- 그래야 데이터 수가 줄어들고 알고리즘에 필요한 비용이 기하급수적으로 줄어든다.
- 그래서 먼저 예외사항부터 제거해주었다. ayaaya, yeye처럼 같은 단어가 연속으로 나올 수 없기 때문에 해당 단어들이 들어가 있는 String에는 @를 치환하고 넘어간다.
- 그럼 이제 정상정인 문자로 이루어진 단어들만 남는데, 이 단어들 중 speakable의 문자가 포함된 단어는 !로 값을 치환한다.
- !로 치환하고 나서 마지막에 !를 공백으로 바꿔주는데 이 이유는 "yayaewoo"와 같이 aya, woo가 처음부터 공백으로 사라지면
- "ye"이렇게 단어들이 붙어버려 발음할 수 있는 단어로 바뀌는 오류가 발생한다.
- 처음엔 그것을 모르고 공백을 사용했다가 나중에 다시 느낌표로 치환하고 이를 다시 공백으로 치환함으로써 마지막 단계에 글자들이 전부 잘 지워졌는지 확인할 수 있다.
* 코드
import Foundation
func solution(_ babbling:[String]) -> Int {
var arr = babbling
let speakable = ["aya", "ye", "woo", "ma"]
let exception = ["ayaaya", "yeye", "woowoo", "mama"]
var count = 0
for i in 0...arr.count-1 {
for word in exception {
arr[i] = arr[i].replacingOccurrences(of: word, with: "@")
}
for word in speakable {
arr[i] = arr[i].replacingOccurrences(of: word, with: "!")
}
arr[i] = arr[i].replacingOccurrences(of: "!", with: "")
if arr[i].count == 0 {
count += 1
}
}
return count
}
정리(Today I Learned)
- 이 문제를 위해 함수를 따로 만든 분도 계시던데... 당장은 이렇게 간단하게 만든 코드가 더 효율적으로 보일지언정, 나중에 더 원론적인 코드를 작업해야할 땐 직접 이 모든 알고리즘을 세세하게 만들줄 알아야 할 것 같다.