[Leetcode/Easy] 가장 흔한 단어 (819. Most Common Word, Swift)

2024. 6. 29. 15:58Algorithm

https://leetcode.com/problems/most-common-word/description/

 

🤔 문제 설명

paragraph에서 금지된 단어를 제외하고, 가장 빈번하게 등장하는 단어를 출력하세요.
paragraph의 단어는 대소문자를 구분하지 않으며, 구두점(마침표, 쉼표 등) 또한 무시합니다. 답은 소문자로 반환해야 합니다.

paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
banned = ["hit"]
// "ball"

 

💡 풀이

사용되는 내부 메서드가 많아서 그렇지 풀이 과정은 단순하다.
한 문장으로 되어있는 것을 단어별로 구분 -> 소문자 변환 + 구두점 무시 -> 단어별로 빈번 횟수 count -> 가장 많은 count인 단어 return 순으로 해결했다.

이 방식에서 사용된 Swift 메서드를 여기서 한번 정리해보도록 하겠다.

  • string.lowercased() : 모든 String의 문자를 소문자로 변환한 새로운 문자열을 return하는 메서드
  • string.replacingOccurrences(of:, with:) : String에서 of에 지정된 문자열을 with에 지정된 문자열로 반환한 새로운 문자열을 return하는 메서드
  • string.components(separatedBy:) : separatedBy에 지정된 문자 Set을 기준으로 String을 분리해서 [String] 형태로 반환
  • joined() : Array의 각 요소를 연결해서 하나의 String으로 반환하는 메서드
  • contains() : 특정 문자열이나 문자를 포함하고 있는지 확인하는 메서드

 

🧑🏻‍💻 코드 (Swift ver.)

class Solution {
    func mostCommonWord(_ paragraph: String, _ banned: [String]) -> String {
        var wordCheckDict = [String: Int]()

        // 단어 처리(소문자 + 공백 변환) & 구분(공백 기준)
        let words = paragraph.lowercased().replacingOccurrences(of: ",", with: " ").split(separator: " ")

        // 단어 반복하면서 갯수 체크
        for word in words {
            var newWord = word.components(separatedBy: ["!", "?", "'", ",", ";", "."]).joined()
            // 딕셔너리에 등록된 word가 아닌 경우 + banned 단어가 아닌 경우 -> 새롭게 딕셔너리 카운트 추가
            if (wordCheckDict[newWord] == nil && !banned.contains(newWord)) { 
                wordCheckDict[newWord] = 1 
            } else {
                if let count = wordCheckDict[newWord] { wordCheckDict[newWord] = count + 1 }
            }
        }

        // 가장 자주 등장하는 단어 찾기
        var mostCommonWord = ""
        var maxCount = 0
        for (word, count) in wordCheckDict {
            if count > maxCount {
                mostCommonWord = word
                maxCount = count
            }
        }
        
        return mostCommonWord
    }
}