03. 가장 흔한 단어
📌문제
금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라. 대소문자 구분을 하지 않으며, 구두점(마침표, 쉼표 등) 또한 무시한다.
- 예제1
📝입력
`paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
banned = ["hit"]`
💻출력
`"ball"`
- 예제2
📝입력
`paragraph = "a.", banned = []`
💻출력
`"a"`
📌풀이
1. Map과 Set을 활용한 방법 (12ms, 42.5mb)⭐
public String mostCommonWord(String paragraph, String[] banned) {
String answer = "";
Map<String, Integer> map = new HashMap<>();
Set<String> banSet = new HashSet<>();
String[] paragraphArr = paragraph.replaceAll("[^A-Za-z]"," ").toLowerCase().split(" ");
for(String ban : banned){
banSet.add(ban);
}
for(String s : paragraphArr){
if(!banSet.contains(s) && !s.equals("")){
map.put(s, map.getOrDefault(s, 0) + 1 );
}
}
Integer maxValue = Collections.max(map.values());
for(Map.Entry<String, Integer> entry : map.entrySet()){
if(entry.getValue().equals(maxValue)) {
answer = entry.getKey();
break;
}
}
return answer;
}
- 정규식을 사용해서 영문자를 제외한 모든 글자는 공백으로 처리하여 공백을 기준으로 문자열 배열 만들기
- banSet 세트에 들어있는 값을 활용해서 금지된 단어는 정답을 담을 맵에 넣지 않음 (반복문을 돌려서 할 수도 있지만 contain의 시간 복잡도는 O(1)임으로 활용하자)
- 맵에 담긴 value 중 최대 값을 찾고, 그 값을 토대로 키값을 찾아서 반환
1. Map과 flag를 활용한 방법 (23ms 42.6mb)
public String mostCommonWord(String paragraph, String[] banned) {
String answer = "";
Map<String, Integer> map = new HashMap<>();
// 답이 소문자 반환이기 때문에 소문자로 반환 후, 문제에서 알려준대로 문자열을 자른다.
String[] paragraphArr = paragraph.toLowerCase().split(" |!|\\?|'|,|;|\\.");
// 무시하는 값을 위해 플래그를 사용함
boolean flag = false;
for(String s : paragraphArr){
// 배열을 보니 "" 값도 들어가 있어 이값은 제외해줌
if(s.equals("")) continue;
for(String ban : banned) {
// 금지된 단어를 만나면 플래그 on
if(s.equalsIgnoreCase(ban)){
flag = true;
break;
}
}
// 플래그가 false 면 금지된 단어가 아니기 때문에 add
if(!flag) map.put(s, map.getOrDefault(s, 0) + 1);
else flag = false;
}
// 위에서 예외처리를 다 해줬기 때문에 value 중 제일 큰 값을 가져옴
Integer maxValue = Collections.max(map.values());
for(Map.Entry<String, Integer> entry : map.entrySet()){
if(entry.getValue().equals(maxValue)) {
// 키값 찾았으면 break;
answer = entry.getKey();
break;
}
}
return answer;
}
- 위와 다른 점은 split 자체에서 문자열을 잘라준 기준 그대로를 넣어 문자열 배열을 만들어줌
- 이중 반복문을 돌면서 flag를 활용해 map에 금지된 단어를 제외한 모든 단어를 넣어줌(이중 반복문이기 때문에 시간복잡도 O(N*N))
'Algorithm > PTUStudy' 카테고리의 다른 글
2주차. 문자열 조작(가장 긴 팰린드롬 부분 문자열) (0) | 2023.01.16 |
---|---|
2주차. 문자열 조작(그룹 애너그램) (0) | 2023.01.16 |
1주차. 문자열 조작(로그파일 재정렬) (0) | 2023.01.16 |
1주차. 문자열 조작(문자열 뒤집기) (0) | 2023.01.16 |
1주차. 문자열 조작(유효한 팰린드롬) (0) | 2023.01.16 |