TIL/알고리즘 공부

프로그래머스 Lv. 1 Swift 알고리즘 - 옹알이(2)

여의도사노비 2022. 12. 30. 15:55
728x90

이 문제는 특정 단어들을 찾아내고 그 값을 조합할 수 있느냐를 물어보는 문제이다.

 

문제를 보자마자 replacingOccurences가 생각났지만... 아무래도 해당 함수가 소요시간이 꽤 걸리는 함수이다 보니, 이번에는 최대한 이거말고 다른 방향으로 풀어보고자했다. 그런데 답이 안나와서... 결국 relacingOccurences를 사용했다..ㅎㅎ

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 알고리즘을 풀면서 굉장히 중요하게 느낀 것은 예외사항을 빠르게 쳐내주는 것이었다.
  2. 그래야 데이터 수가 줄어들고 알고리즘에 필요한 비용이 기하급수적으로 줄어든다.
  3. 그래서 먼저 예외사항부터 제거해주었다. ayaaya, yeye처럼 같은 단어가 연속으로 나올 수 없기 때문에 해당 단어들이 들어가 있는 String에는 @를 치환하고 넘어간다.
  4. 그럼 이제 정상정인 문자로 이루어진 단어들만 남는데, 이 단어들 중 speakable의 문자가 포함된 단어는 !로 값을 치환한다.
  5. !로 치환하고 나서 마지막에 !를 공백으로 바꿔주는데 이 이유는 "yayaewoo"와 같이 aya, woo가 처음부터 공백으로 사라지면
  6. "ye"이렇게 단어들이 붙어버려 발음할 수 있는 단어로 바뀌는 오류가 발생한다.
  7. 처음엔 그것을 모르고 공백을 사용했다가 나중에 다시 느낌표로 치환하고 이를 다시 공백으로 치환함으로써 마지막 단계에 글자들이 전부 잘 지워졌는지 확인할 수 있다.

 

 

* 코드

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)

  1. 이 문제를 위해 함수를 따로 만든 분도 계시던데... 당장은 이렇게 간단하게 만든 코드가 더 효율적으로 보일지언정, 나중에 더 원론적인 코드를 작업해야할 땐 직접 이 모든 알고리즘을 세세하게 만들줄 알아야 할 것 같다.