반응형
1. 문제
paragraph라는 string과 사용 금지된 단어로 구성된 banned라는 string array가 주어진다.
사용 금지되지 않은 단어 중 가장 빈번하게 나타난 단어를 반환하면 된다.
금지되지 않은 단어가 최소 하나이고, 고유한 답이 보장된다.
단락의 단어는 대소문자를 구분하지 않고, 답변은 소문자로 반환되어야 한다.
2. 풀이 과정
먼저 Example 1을 보면 ball과 BALL은 같은 단어로 판단하기도 하고, 답은 소문자로 반환되어야 하니 편의를 위해 paragraph를 소문자로 만들어준다.
string.Split을 사용해 단어로만 이루어진 배열을 구해놓는다.
구분자의 종류는 ' ', '!', '?', ''', ',', ';', '.'로 총 7가지이다.
작은따옴표(')의 경우에는 앞에 \를 붙여 프로그램이 문자로 인식할 수 있도록 한다.
다시 Example 1을 보면 paragraph의 문자들이 ' '로만 구분되어있지 않고 ','가 섞여있다.
Split 옵션을 StringSplitOptions.RemoveEmptyEntries로 주어서 여러 개의 구분자가 붙어서 나오는 경우도 대처하도록 했다.
모든 문자를 얻은 뒤, Dictionary에 단어별로 몇 개 있는지 저장한 뒤 개수가 많은 순서대로 내림차순 정렬했다.
Dictionary를 앞에서부터 순회하며 단어가 banned에 없다면 return 하도록 했다.
public class Solution {
public string MostCommonWord(string paragraph, string[] banned)
{
paragraph = paragraph.ToLower();
char[] sep = { '.', ',', '!', '?', '\'', ';', ' '};
var split = paragraph.Split(sep, StringSplitOptions.RemoveEmptyEntries);
var dict = new Dictionary<string, int>(split.Length);
for (int i = 0, length = split.Length; i < length; ++i)
{
if (!dict.TryAdd(split[i], 1))
dict[split[i]]++;
}
dict = dict.OrderByDescending(x => x.Value).ToDictionary(a => a.Key, b => b.Value);
foreach (var el in dict)
{
if (Array.IndexOf(banned, el.Key) < 0)
return el.Key;
}
return "";
}
}
반응형
'LeetCode 풀이노트' 카테고리의 다른 글
[C#] 1009. Complement of Base 10 Integer (0) | 2023.07.10 |
---|---|
[C#] 1493. Longest Subarray of 1's After Deleting One Element (0) | 2023.07.05 |
[C#] 137. Single Number II (0) | 2023.07.04 |
[C#] 2090. K Radius Subarray Averages (0) | 2023.06.20 |
[C#] 1161. Maximum Level Sum of a Binary Tree (0) | 2023.06.15 |