swift 리트코드 문제풀이 - leetcode 819 가장 흔한 단어

swift 리트코드 문제풀이 - leetcode 819 가장 흔한 단어

 

leetcode 819. Most Common Word

 

문제

금지된 단어를 제외한 가장 많이 등장하는 단어를 출력하라. 대소문자 구분하지 않고, 마침표, 쉼표 등은 무시한다.

 

 

예제 

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

Output: "ball"

 

 

문제파악을 해보자면 가장 많이 등장하는 단어를 출력하는 함수를 만들어야 된다. 인자는 두개가 되겠네.

하나는 "Bob hit a ball, the hit BALL flew far after it was hit." 이런 문자열 값이고 나머지 하나는 ["hit"] 이런 금지 단어가 있는 배열이 되겠군.

 

그리고 대소문자 구분하지 않으니깐, 모두 소문자 처리 해주고,

마침표, 쉼표는 무시하니깐 정규표현식으로 영문자와 " " 이런 빈칸만 출력될 수 있도록 전처리를 해준다. 그리고 마침표, 쉼표는 " " 띄워쓰기 문자로 치환해준다. 왜냐면 나중에 " " 띄워쓰기 문자 기준으로 단어들을 잘라서 배열을 만들것이기 때문이다!

 

그리고 핵심 아이디어는 딕셔너리를 이용하는 것이다. 위의 전처리된 배열을 반복문을 돌려서 딕셔너리를 만들것인데, 딕셔너리의 key 값은 단어, value 값은 존재하는 단어의 개수로 만들어 줄것임.

 

예를들어 ["cat" : 3 , "dog" : 1] 이런식으로 나오게 하면 될것 같다. 그래야 제일 많은 단어가 어떤 단어인지 조금 더 직관적으로 알 수 있기 때문이다. 

 

그리고 마지막으로 딕셔너리에서 금지 단어를 제거해준다음 딕셔너리에서 제일 많이 존재하는 단어를 뽑아 내면 되는 것이다!

 

이런 흐름 머릿속으로 그려본 다음 아래 코드를 작성했다.

 

var paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."

var banned = ["hit"]

func mostCommonWord(_ paragraph: String, _ banned: [String]) -> String {
    
    //타입 Annotation으로 딕셔너리 생성하기
    var tempDic: [String: Int] = [:]
    
    //영문자와 숫자 " " 대상
    let pattern = "[^A-Za-z]+"
    var resultStr = paragraph.replacingOccurrences(of: pattern, with: " ", options: [.regularExpression])
    
    //소문자로 변환
    resultStr = resultStr.lowercased()
    
    //문자열을 " " 기준을 배열로 변환
    let wordArray = resultStr.split(separator: " ")
    
    //문자:카운터 구조의 딕셔너리 생성
    for word in wordArray{
        let keys = tempDic.keys.filter{ $0.elementsEqual(word) }
        let wordKey = String(word)
        if keys.count > 0 {
            tempDic[wordKey]! += 1
        }else{
            tempDic[wordKey] = 1
        }
    }
    
    // 금지문자 삭제
    for bannedWord in banned{
        let keys = tempDic.keys.filter{ $0.elementsEqual(bannedWord) }
        let bannedWordKey = String(bannedWord)
        if keys.count > 0 {
            tempDic.removeValue(forKey: bannedWordKey)
        }
    }
    
    //value가 큰 순서대로 딕셔너리안의 값들을 정렬
    let sortedDic = tempDic.sorted { $0.1 > $1.1 }
    

    return sortedDic[0].key
}


print(">>>> mostCommonWord :\( mostCommonWord(paragraph, banned) )") //>>>> mostCommonWord :ball

 

 

 

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