
기본적으로 백준 문제를 풀 때 간결화 된 코드보다 가독성 좋은 코드를 1순위로 생각하고 작성한다.
HashMap 을 사용해 실제 포함된 알파벳만 추려서 구하는게 가독성 측면에서 좋을 것 같았다.
(사실 그것보다 아직까지는 시간까지 고려할 수준이 안된다...)
import java.io.*;
import java.util.*;
public class Main {
public static void solution() throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
String word = br.readLine().toUpperCase();
Map<Character, Integer> count = new HashMap<>();
for (char c : word.toCharArray()) {
count.put(c, count.getOrDefault(c, 0) + 1);
}
int maxCount = 0;
char res = '?';
for (Map.Entry<Character, Integer> entry : count.entrySet()) {
if (entry.getValue() > maxCount) {
res = entry.getKey();
maxCount = entry.getValue();
} else if (entry.getValue() == maxCount) {
res = '?';
}
}
System.out.println(res);
}
}
public static void main(String[] args) throws IOException {
solution();
}
}
먼저 결과값이 대문자로 반환되어야 하므로 toUpperCase 로 대문자 변환을 진행했다.
getOrDefault 를 사용해 HashMap 에 key의 존재 여부에 따라 value에 변화를 주도록 했다.
각 key, value의 쌍인 Entry 를 가져와 순회 후 가장 높은 빈도의 key를 구한다.
대부분의 사람들은 ASCII 코드를 사용해서 사이클을 돌려 알파벳 빈도를 구하는 방식을 사용했는데 이유를 알아보니 처리 시간과 메모리 사용량에서 장점을 보인다.
난 ASCII 코드를 사용할 생각 조차 못했는데 이 부분은 그냥 문제를 많이 풀어봐야 알 것 같다.