문제 링크: https://www.acmicpc.net/problem/20291

 

20291번: 파일 정리

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

www.acmicpc.net

▶문제

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

바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.

화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다. 스 브러스의 요청은 다음과 같다.

  • 파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
  • 보기 편하게 확장자들을 사전 순으로 정렬해 줘

그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!

▶입력

첫째 줄에 바탕화면에 있는 파일의 개수 N이 주어진다. (1≤N≤50000)

둘째 줄부터 N개 줄에 바탕화면에 있는 파일의 이름이 주어진다. 파일의 이름은 알파벳 소문자와 점(.)으로만 구성되어 있다. 점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다. 각 파일의 이름의 길이는 최소 3 최대 100이다.

▶출력

확장자의 이름과 그 확장자 파일의 개수를 한 줄에 하나씩 출력한다. 확장자가 여러 개 있는 경우 확장자 이름의 사전 순으로 출력한다.

▶해설

자료구조인 Map을 사용하면 쉽게 풀 수 있는 문제입니다. 조건을 살펴보겠습니다.

 

1. 확장자로만 구분하며, 확장자의 갯수를 구한다.

2. 확장자를 정렬해라.

 

문자열에 대해서 '.' 뒤에 해당하는 것들이 확장자이므로 indexOf와 substring으로 확장자에 해당하는 것을 구해줍니다.  

String s = br.readLine();
int index = s.indexOf('.');
String str = s.substring(index+1);

 

구했다면 Map을 활용합니다. 만약 구한 확장자가 Key값으로 이미 존재한다면 Value에 1을 더해주고, 없다면 1을 넣어주면 됩니다. 이때 getOrDefault를 사용합니다.

map.put(str, map.getOrDefault(str, 0)+1);

 

모든 값들을 채웠다면 KeySet()을 이용해서 모든 Key값을 List에 넣어 정렬해주고, 출력하면 됩니다. 

Set<String> strings = map.keySet();

List<String> list = new ArrayList<>(strings);

Collections.sort(list);

for(int i=0; i<list.size(); i++){
    System.out.println(list.get(i)+" "+map.get(list.get(i)));
}

 

전체 코드

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




public class Main {

    static int n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        HashMap<String, Integer> map = new HashMap<>();

        for(int i=0; i<n; i++){
            String s = br.readLine();
            int index = s.indexOf('.');
            String str = s.substring(index+1);
            map.put(str, map.getOrDefault(str, 0)+1);
        }

        Set<String> strings = map.keySet();

        List<String> list = new ArrayList<>(strings);

        Collections.sort(list);

        for(int i=0; i<list.size(); i++){
            System.out.println(list.get(i)+" "+map.get(list.get(i)));
        }
    }
}