[백준] 20291 : 파일정리 - Java

이지연·2025년 12월 14일
post-thumbnail

문제 접근

  1. 파일 개수 N을 입력받는다.
  2. N개의 파일명을 순차적으로 읽어들인다.
  3. 각 파일명에서 .을 기준으로 확장자만 추출한다 (StringTokenizer 사용).
  4. TreeMap에 확장자를 key, 파일 개수를 value로 저장:
    • 존재하는 확장자: value + 1
    • 새로운 확장자: value = 1
  5. TreeMap의 자동 정렬 특성을 활용해 사전순 출력.

즉, "파일명 파싱 → 확장자 카운팅 → 정렬된 출력" 과정을 수행한다.


TreeMap 자료구조 사용 이유

이 문제는 확장자별 빈도수 집계 + 사전순 출력이 필요하다.
HashMap으로는 정렬이 안 되지만, TreeMap(Red-Black Tree 기반)은:

  • 키 자동 정렬 (입력 순서 무관)
  • O(log N) 삽입/조회 성능
  • 반복자 순회 시 사전순 보장

주요 메서드:

  • containsKey(): 키 존재 여부 확인
  • get(): value 조회
  • put(): 키-값 저장/업데이트

시뮬레이션 예시

입력: n=8, 파일명들: prolific.txt, accraz.spc, sbrus.txt, spc.spc

단계파일명확장자TreeMap 상태
1prolific.txttxt{txt=1}
2accraz.spcspc{spc=1, txt=1}
3sbrus.txttxt{spc=1, txt=2}
4spc.spcspc{spc=2, txt=2}

최종 출력: {spc=2, txt=2}

정리

  • TreeMap으로 자동 정렬 + 빈도 집계를 한 번에 해결.
  • StringTokenizer파일명.확장자 파싱 간단 구현.
  • 사전순 출력을 위해 TreeMap.entrySet() 순회.

제출 코드

import java.io.*;
import java.util.*;

public class S20291 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        
        Map<String, Integer> fileMap = new TreeMap<>();
        
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            String file_name = st.nextToken(); // 파일명은 무시
            String file_extension = st.nextToken(); // 확장자만 담고 있는 상태
            if (file_map.containsKey(file_extension)) {
                file_map.put(file_extension, file_map.get(file_extension) + 1);
            } else {
                file_map.put(file_extension, 1);
            }+ 1);
        }

        for (String a : file_map.keySet()) {
            System.out.println(a + " " + file_map.get(a));
        }
    }
}
profile
Eazy하게

1개의 댓글

comment-user-thumbnail
2025년 12월 14일

마지막 출력 형식 아래의 방식도 학습 필요함

for (Map.Entry<String, Integer> e : file_map.entrySet()) {
    System.out.println(e.getKey() + " " + e.getValue());
}
답글 달기