✔ 난이도 - Bronze 2
HashMap을 사용하여 알파벳에 따른 빈도수를 key-value 쌍으로 관리함
그 후 정렬하고 상위 2개를 비교하여(2개 이상일 시) 같으면 ?를, 다르다면 최상단의 key 값을 출력함
공백일때 예외처리도 신경써주기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
String input = br.readLine();
HashMap<Character, Integer> hm = new HashMap<>();
for (char word : input.toCharArray()){
if (word == ' ') continue;
hm.put(word, hm.getOrDefault(word, 0) + 1);
}
List<Map.Entry<Character, Integer>> list = new ArrayList<>(hm.entrySet());
list.sort((a, b) -> Integer.compare(b.getValue(), a.getValue()));
// System.out.println(list.toString());
Map.Entry<Character, Integer> first = list.get(0);
if (list.size() == 1) {
sb.append(first.getKey());
} else {
Map.Entry<Character, Integer> second = list.get(1);
if (first.getValue() == second.getValue()) {
sb.append('?');
} else {
sb.append(first.getKey());
}
}
sb.append('\n');
}
System.out.println(sb);
}
}
O(T * N)
br.readLine(): 길이 N의 문자열을 읽는 데
O(N)
for (char word : input.toCharArray()): 문자열의 각 문자를 한 번씩 순회하므로O(N)
hm.put() 및 hm.getOrDefault(): 해시맵의 삽입 및 조회 연산은 평균적으로O(1)
따라서 이 부분의 전체 시간 복잡도는 O(N) + O(N) * O(1) = O(N) -> 상수 시간
해시맵에 저장된 고유 문자의 개수를 C라고 할 때, 영어 소문자는 26개이므로 C의 최댓값은 26임.
new ArrayList<>(hm.entrySet()): 해시맵의 모든 항목을 리스트로 옮기는 데 걸리는 시간은O(C)-> 상수
list.sort(): 리스트를 정렬하는 데는O(C log C)-> 상수
C는 알파벳 개수(최대 26)로 고정된 상수이므로, 이 단계의 시간 복잡도는 O(1) -> 상수 시간
리스트의 특정 인덱스에 접근하는 list.get() 연산은 O(1) -> 상수 시간
따라서 전체 코드의 총 시간 복잡도는 O(T * N)
V getOrDefault(Object key, V defaultValue) : key와 맵핑된 value값을 반환 (없으면 defaultValue값을 반환)