본문 바로가기
PS/BOJ

백준 20291 자바 - 파일 정리 (BOJ 20291 JAVA)

by Nahwasa 2022. 2. 17.

문제 : boj20291

 

1. A.B 의 형태로 입력이 주어질 때, 결국 A는 아예 필요없고 B만 보면 된다. 따라서 문자열 파싱을 통해 '.' 뒤의 문자만 빼낼 수 있어야 한다.

 

2. 확장자에 대한 카운팅이 필요하다. 해시를 사용하는것이 효율적이다. 해시맵을 사용해 key를 확장자로 두고, value를 카운팅으로 하면 된다.

 

3. 결과를 확장자 이름순으로 출력해야 한다. 해시맵에서 keySet을 빼내서 정렬해도 되겠지만, 애초에 메모리를 좀 더 써서 따로 key값만 가지고 있다면 더 효율적으로 정렬할 수 있다. 내 경우엔 리스트에 새로운 key가 나올 경우 담아두었다. 그리고 리스트를 정렬한 후, 오름차순으로 정렬되어있는 key가 담긴 리스트를 순회하며 key와 value를 얻어 출력해줬다.

 

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        HashMap<String, Integer> hm = new HashMap<>();
        ArrayList<String> arr = new ArrayList<>();
        while (n-->0) {
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            st.nextToken();
            String ext = st.nextToken();
            if (!hm.containsKey(ext)) {
                arr.add(ext);
                hm.put(ext, 1);
            } else {
                hm.put(ext, hm.get(ext)+1);
            }
        }
        Collections.sort(arr);
        StringBuilder sb = new StringBuilder();
        for (String str : arr) {
            sb.append(str).append(' ').append(hm.get(str)).append('\n');
        }
        System.out.print(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글