📝 문제 설명

김형택은 탑문고의 직원으로, 그날 가장 많이 팔린 책의 제목을 칠판에 써놓는 일을 한다. 오늘 하루 동안 팔린 책의 제목들이 입력으로 주어질 때, 가장 많이 팔린 책의 제목을 출력하는 프로그램을 작성한다.

🤔 문제 분석 및 접근 방식

문제를 처음 접했을 때, "책 제목별로 팔린 횟수를 어떻게 효율적으로 셀 것인가?"가 핵심 질문이었다. '책 제목'과 '판매 부수'라는 두 데이터를 한 쌍으로 관리해야 하므로 자연스럽게 Map 자료구조를 떠올렸다.

  1. 입력 방식 결정: 코딩 테스트에서는 대량의 입력을 처리해야 할 때가 많으므로, 성능상 이점이 있는 **BufferedReader**를 사용하는 것이 좋다고 판단했다. Scanner보다 빠르고, BufferedReader에 익숙해지는 것이 장기적으로 도움이 될 것이라 생각했다.
  2. 핵심 자료구조 결정:
  3. 최종 전략 수립: 문제의 크기(N ≤ 1,000)를 고려했을 때, HashMapTreeMap의 성능 차이는 무시할 수 있는 수준이다. 따라서 코드가 더 간결하고, 실수할 여지가 적으며, 문제의 요구사항에 더 정확히 부합하는 TreeMap을 사용하기로 최종 결정했다.

💡 풀이 아이디어 / 로직

  1. TreeMap<String, Integer> 타입의 map을 생성한다. Key는 책 제목, Value는 판매 부수를 저장한다.
  2. BufferedReader로 팔린 책의 개수 N을 입력받는다.
  3. for 반복문을 N번 실행하여, 매번 책 제목을 한 줄씩 입력받는다.
  4. 입력받은 책 제목(book)을 map.getOrDefault(book, 0) + 1 로직을 사용해 map에 저장한다.
  5. 모든 책을 집계한 후, 최다 판매 부수(maxValue)와 정답(answer)을 저장할 변수를 초기화한다.
  6. for-each 구문을 사용해 map.entrySet()을 순회한다.
  7. 현재 EntryValue(판매 부수)가 maxValue보다 크면, maxValue를 현재 Value로, answer를 현재 Key(책 제목)로 업데이트한다.
  8. 반복문이 끝나면 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);
    }
}