김형택은 탑문고의 직원으로, 그날 가장 많이 팔린 책의 제목을 칠판에 써놓는 일을 한다. 오늘 하루 동안 팔린 책의 제목들이 입력으로 주어질 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성한다.
문제를 처음 접했을 때, "책 제목별로 팔린 횟수를 어떻게 효율적으로 셀 것인가?"가 핵심 질문이었다. '책 제목'과 '판매 부수'라는 두 데이터를 한 쌍으로 관리해야 하므로 자연스럽게 Map 자료구조를 떠올렸다.
BufferedReader**를 사용하는 것이 좋다고 판단했다. Scanner보다 빠르고, BufferedReader에 익숙해지는 것이 장기적으로 도움이 될 것이라 생각했다.
HashMap): 가장 먼저 떠오른 것은 HashMap이다. Key에 책 제목(String), Value에 판매 부수(Integer)를 저장하면 되겠다고 생각했다. 이 경우, 모든 책의 판매량을 집계한 후, 전체 Map을 순회하며 최댓값을 찾고, 최댓값이 동일할 경우 사전순을 비교하는 추가 로직이 필요하다.TreeMap): "만약 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목을 출력한다"는 결정적인 조건을 보고 TreeMap의 가능성을 떠올렸다. TreeMap은 Key를 기준으로 자동으로 정렬해주므로, 이 문제의 '사전순 정렬' 요구사항을 별도의 로직 없이 자료구조의 특징만으로 해결할 수 있겠다는 생각이 들었다.
HashMap과 TreeMap의 성능 차이는 무시할 수 있는 수준이다. 따라서 코드가 더 간결하고, 실수할 여지가 적으며, 문제의 요구사항에 더 정확히 부합하는 TreeMap을 사용하기로 최종 결정했다.TreeMap<String, Integer> 타입의 map을 생성한다. Key는 책 제목, Value는 판매 부수를 저장한다.BufferedReader로 팔린 책의 개수 N을 입력받는다.for 반복문을 N번 실행하여, 매번 책 제목을 한 줄씩 입력받는다.book)을 map.getOrDefault(book, 0) + 1 로직을 사용해 map에 저장한다.
book이 map에 이미 존재하면 기존 Value에 1을 더해 업데이트한다.book이 map에 없으면 기본값 0에 1을 더해 새로운 Entry로 추가한다.maxValue)와 정답(answer)을 저장할 변수를 초기화한다.for-each 구문을 사용해 map.entrySet()을 순회한다.
TreeMap은 Key(책 제목)의 사전순으로 자동 정렬되어 있으므로, 별도의 정렬 로직 없이 순회하는 것만으로 사전순 조건을 만족시킬 수 있다.Entry의 Value(판매 부수)가 maxValue보다 크면, maxValue를 현재 Value로, answer를 현재 Key(책 제목)로 업데이트한다.answer에 저장된 최종 결과를 출력한다.import java.util.*;
import java.util.Map.Entry;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// Key(책 제목)가 자동으로 사전순 정렬되는 TreeMap 사용
TreeMap<String, Integer> sales = new TreeMap<>();
int n = Integer.parseInt(reader.readLine());
for (int i = 0; i < n; i++) {
String book = reader.readLine();
// getOrDefault를 사용해 간결하게 판매량 집계
sales.put(book, sales.getOrDefault(book, 0) + 1);
}
int maxValue = 0;
String answer = "";
// for-each 구문으로 깔끔하게 순회
// TreeMap이므로 entry는 이미 책 제목의 사전순으로 정렬된 상태
for (Entry<String, Integer> entry : sales.entrySet()) {
if (entry.getValue() > maxValue) {
maxValue = entry.getValue();
answer = entry.getKey();
}
}
System.out.println(answer);
}
}