김형택은 탑문고의 직원으로, 그날 가장 많이 팔린 책의 제목을 칠판에 써놓는 일을 한다. 오늘 하루 동안 팔린 책의 제목들이 입력으로 주어질 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성한다.
문제를 처음 접했을 때, "책 제목별로 팔린 횟수를 어떻게 효율적으로 셀 것인가?"가 핵심 질문이었다. '책 제목'과 '판매 부수'라는 두 데이터를 한 쌍으로 관리해야 하므로 자연스럽게 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);
}
}