본문 바로가기
백준

[백준] 20291번 : 파일 정리 – JAVA [자바]

by Hongwoo 2023. 7. 18.
반응형

https://www.acmicpc.net/problem/20291

 

20291번: 파일 정리

친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 20291번 파일 정리는 실버 3 난이도의 문자열, 정렬, 해시 및 파싱 문제이다. 이 문제에서는 N개의 파일 이름들이 주어지고 이 파일 이름들의 확장자와 개수를 출력하면 된다. 그리고, 파일 확장자가 여러 개 있을 때 사전순으로 정렬해서 출력하면 된다.

 

이 문제는 두 가지 방식으로 풀겠다. 첫 번째 방식은 HashMap을 이용하는 방식이고 두 번째 방식은 TreeMap을 이용하는 방식이다. 

 

우선 HashMap을 이용한 풀이를 살펴보겠다. 우선, 파일 이름들은 name.ext 형태를 띠고 있기 때문에 이 문자열을 파싱 할 때 "."을 구분문자로 사용해서 입력을 받으면 된다. 이 확장자를 입력받으면 바로 HashMap에 개수대로 저장을 한다. 맵의 getOrDefault 함수를 사용하면 쉽게 할 수 있다.

 

그리고, 새로운 확장자를 ArrayList에 저장한다. 이 이유는, HashMap은 정렬된 구조가 아니기 때문에 따로 사전순으로 정렬을 해줘야 한다. 이렇게 다 입력을 받고 나면 기본 Collections.sort(list)를 해서 사전순으로 정렬을 하고 이 리스트에 있는 확장자들을 iterate 해서 출력을 해주면 된다.

 

두 번째 풀이 방식은 TreeMap을 이용해서 푸는 것이다. TreeMap은 이진트리를 기반으로 한 Map 컬렉션이다. 그리고 TreeMap의 특징은 바로 TreeMap에 객체를 저장하면 자동으로 정렬된다는 것이다. 따라서, 정렬을 해야 하는 이번 문제에서는 유용하게 쓸 수 있다. 다만, TreeMap을 평상시에 잘 사용 안 하는 이유는 일반적으로 Map으로써의 성능이 HashMap보다 떨어지기 때문이다. 따라서, 평상시에는 TreeMap보다는 HashMap을 쓰는 것을 추천한다. 

 

TreeMap은 기본적으로 삽입을 할 때 자체적으로 정렬을 하기 때문에 확장자들을 입력받고 TreeMap에 넣어주면 된다. 그리고 이 TreeMap을 iterate 한 값들을 출력시키는 게 전부다.

 

추가로, 이 두 풀이 방식의 성능을 비교하자면 TreeMap의 성능이 메모리적이나 시간적으로 효율적이다 (아래에 있는 사진을 참고하면 되겠다).

 

 

자세한 코드는 아래에 있는 코드를 참고하면 되겠다.

 


 

  • 코드 1: HashMap

 

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

public class Main {
    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> map = new HashMap<>();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            st.nextToken();
            String extension = st.nextToken();
            if (!map.containsKey(extension)) list.add(extension);
            map.put(extension, map.getOrDefault(extension, 0) + 1);
        }
        Collections.sort(list);
        StringBuilder sb = new StringBuilder();
        for (String s : list) {
            sb.append(s + " " + map.get(s) + "\n");
        }
        System.out.println(sb);
    }

}

 

 


  • 코드 2: TreeMap

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        TreeMap<String, Integer> map = new TreeMap<>();
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            st.nextToken();
            String extension = st.nextToken();
            map.put(extension, map.getOrDefault(extension, 0) + 1);
        }
        StringBuilder sb = new StringBuilder();
        for (String s : map.keySet()) {
            sb.append(s + " " + map.get(s) + "\n");
        }
        System.out.println(sb);
    }

}

 

 

반응형

댓글