All :L

[BOJ/Java] 파일 정리 (20291) 본문

CODING/BOJ

[BOJ/Java] 파일 정리 (20291)

ofijwe 2024. 8. 28. 02:13
반응형

파일 정리 (20291)

1. 문제 분석

문제 개요

  • 여러 파일의 확장자가 주어질 때, 각 확장자의 종류별로 몇 개의 파일이 있는지 계산하는 문제이다.
  • 확장자는 파일 이름 뒤에 .을 기준으로 나타나며, 이를 통해 파일 종류를 구분할 수 있다.

입력 형식

  • 첫 줄에 파일의 개수 N이 주어진다.
  • 다음 N개의 줄에는 각각 파일 이름이 주어진다.

출력 형식

  • 확장자 종류별로 파일 개수를 사전순으로 출력한다.

2. 알고리즘 종류

이 문제는 해시맵(HashMap)과 리스트(List)를 이용한 자료 처리 문제로, 확장자를 키(key)로, 파일 개수를 값(value)으로 하여 해시맵에 저장하고, 이를 사전순으로 정렬해 출력하는 방식으로 해결할 수 있다.

3. 주요 부분 및 코드 작성 방법

1. 해시맵 사용

  • 확장자별 파일 개수를 저장하기 위해 해시맵을 사용한다.
  • 해시맵은 키-값 쌍으로 데이터를 저장하는 자료 구조로, 여기서는 확장자를 키로, 파일 개수를 값으로 저장한다.

2. 사전순 정렬

  • 확장자를 저장한 리스트를 사전순으로 정렬한 후, 이를 출력한다.
  • 리스트는 순서가 있는 데이터 구조로, 확장자 키를 정렬해 저장하고 이를 반복문으로 출력한다.

4. 코드 설명

메인 함수 (main)

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> typeList = new ArrayList<>();

        // 파일 이름을 읽어와 확장자를 해시맵에 저장
        for(int i = 0; i < N; i++) {
            // 파일 이름을 '.' 기준으로 나누어 확장자를 추출
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            st.nextToken(); // 파일 이름 부분 무시
            String ex = st.nextToken(); // 확장자 추출

            // 해시맵에 확장자가 없다면 리스트에 추가
            if(!map.containsKey(ex)) typeList.add(ex);
            // 확장자별 개수 저장 (기존 값에 +1)
            map.put(ex, map.getOrDefault(ex, 0) + 1); 
        }

        // 확장자 리스트를 사전순으로 정렬
        Collections.sort(typeList);

        // 사전순으로 정렬된 확장자와 그 개수 출력
        for(String t : typeList) {
            System.out.println(t + " " + map.get(t)); // 확장자와 그 개수 출력
        }
    }
}

5. 전체 코드

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> typeList = new ArrayList<>();

        // 파일 이름을 읽어와 확장자를 해시맵에 저장
        for(int i = 0; i < N; i++) {
            // 파일 이름을 '.' 기준으로 나누어 확장자를 추출
            StringTokenizer st = new StringTokenizer(br.readLine(), ".");
            st.nextToken(); // 파일 이름 부분 무시
            String ex = st.nextToken(); // 확장자 추출

            // 해시맵에 확장자가 없다면 리스트에 추가
            if(!map.containsKey(ex)) typeList.add(ex);
            // 확장자별 개수 저장 (기존 값에 +1)
            map.put(ex, map.getOrDefault(ex, 0) + 1); 
        }

        // 확장자 리스트를 사전순으로 정렬
        Collections.sort(typeList);

        // 사전순으로 정렬된 확장자와 그 개수 출력
        for(String t : typeList) {
            System.out.println(t + " " + map.get(t)); // 확장자와 그 개수 출력
        }
    }
}
반응형

'CODING > BOJ' 카테고리의 다른 글

[BOJ/Java] 음식물 피하기 (1713)  (0) 2024.08.28
[BOJ/Java] 듣보잡 (1764)  (0) 2024.08.28
[BOJ/Java] 달력 (20207)  (0) 2024.08.28
[BOJ/Java] 스택 수열 (1874)  (0) 2024.08.27
[BOJ/Java] 괄호의 값 (2504)  (0) 2024.08.26
Comments