[백준(JAVA)] 20291번: 파일 정리

세하·2025년 10월 24일

[백준] 문제풀이

목록 보기
70/94
post-thumbnail

문제

✔ 난이도 - Silver 3

설명

그냥 . 기준으로 StringTokenizer로 나누고, HashMap 사용해서 확장자와 그 갯수를 세면 된다.
그러고 정렬하면 끝!
https://velog.io/@seha01130/HashMap이란-메소드-종류-정리
https://velog.io/@seha01130/JAVA-HashMap-정렬하기

풀이

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int T = Integer.parseInt(br.readLine());

        StringTokenizer st;
        Map<String, Integer> hm = new HashMap<String, Integer>();
        for (int i = 0; i < T; i++){
            st = new StringTokenizer(br.readLine(), ".");
            st.nextToken();
            String ext = st.nextToken();

            hm.put(ext, hm.getOrDefault(ext, 0) + 1);
        }

        ArrayList<Map.Entry<String, Integer>> list = new ArrayList<>(hm.entrySet());
        list.sort((a, b) -> a.getKey().compareTo(b.getKey()));

        for(Map.Entry<String, Integer> entry: list){
            sb.append(entry.getKey()).append(' ').append(entry.getValue()).append('\n');
        }

        System.out.println(sb);
    }
}


문제에

점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다.

라는 요구사항이 있어서 그냥 이렇게 간단하게 풀었지만 만약에 . 이 여러번 올 수 있다면 어떨까?
만약 first.tar.gz 라는 확장자가 있을 때 .tar.gz를 확장자로 줘야한다면
StringTokenizer(..., ".")first, tar, gz 세 개로 쪼갠다.
따라서 이게 아니라, indexOf 함수를 쓰면 된다.
indexOf는 문자열의 맨 앞에서부터 .을 찾기 때문에 정확히 첫 번째 점의 위치를 알려준다.

String input = br.readLine();
int firstDotIdx = input.indexOf('.');
String ext = input.substring(firstDotIdx+1); //'.' + 1 위치부터 끝까지 잘라냄

hm.put(ext, hm.getOrDefault(ext, 0) + 1);

만약 가장 마지막 점. 을 기준으로 자른다면 lastIndexOf를 쓰면 되겠죠!

⏰ 시간복잡도

O(NlogN)

0개의 댓글