toLowerCase()
, replaceAll([^ a-z], " ")
{문자열=횟수}
로 key와 value 로 구성한다.class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
//banned 는 소문자로만 이루어져있으므로 비교를 쉽게 하기 위해 paragraph 도 소문자로 변경
paragraph = paragraph.toLowerCase();
//banned 는 영어로만 이루어져있으므로 공백, ! ? ; , ; . 제거
String regex = "[^a-z ]";
paragraph = paragraph.replaceAll(regex, " ");
//banned 한 문자열 제거
for(String ban : banned){
paragraph = paragraph.replaceAll(ban, " ");
}
//띄어쓰기를 기준으로 split
String[] words = paragraph.split(" ");
HashMap<String, Integer> hashmap = new HashMap<>();
for(String word : words){
//공백이나 아무의미없는 값은 건너뛰기
if(word.equals(" ") || word.equals("")) continue;
hashmap.put(word, hashmap.getOrDefault(word, 0)+1);
}
List<Integer> count = new ArrayList<>(hashmap.values());
Collections.sort(count, Collections.reverseOrder());
int max = count.get(0);
String result = "";
for(String key : hashmap.keySet()){
if(hashmap.get(key).equals(max)){
result = key;
break;
}
}
return result;
}
}
아쉬웠던 점은 replaceAll 을 통해 공백으로 치환을 해주어서 두 번 이상의 공백이 생겨 이것을 문자로 받아들여 hahsmap 에 추가된다는 점이었다. 따라서 이 부분을 해결해주기 위해서 불필요하게 공백을 조건문으로 처리하는 과정이 생겼는데 이 부분이 아직은 매끄럽지 못하다고 생각한다.
과거의 내가 푼 과정은
1. paragraph 를 소문자로 변경 후, 특수문자들을 공백으로 처리하고 두번이상의 공백을 한 번의 공백으로 치환해주는 과정을 거친다.
➡️ replaceAll("[\\s+]", " ")
paragraph = paragraph.toLowerCase();
paragraph = paragraph.replaceAll("[!?',;.]", " ");
paragraph = paragraph.replaceAll("\\s+", " ");
List<String, Integer> list = new ArrayList<>(hashmap.keySet());
Collections.sort(list, (k1, k2) -> (hashmap.get(k1).compareTo(hashmap.get(k2))));
// k1, k2 는 list 요소인 key 값들이고
// 비교하는 대상은 각각 k1, k2 에 대응하는 value 값들로
// list 를 정렬하면 value의 순서대로 key 값이 정렬된다.
for(String ban : banned){
list.remove(ban);
}
return list.get(0);