코딩테스트/BOJ

[BOJ] 20291 파일정리 - JAVA

5월._. 2023. 4. 12.
728x90

1. 문제

 

20291번: 파일 정리

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

www.acmicpc.net

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

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

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

파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
보기 편하게 확장자들을 사전 순으로 정렬해 줘
그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!


2. 풀이

1.  TreeMap에 확장자를 넣는다. 있다면 그 값에서 +1, 없다면 1을 저장한다.

2.  entrySet을 사용해서 하나씩 sb에 더한다.

3.  출력한다.

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

public class BOJ_20291_파일정리 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int N = Integer.parseInt(in.readLine());
      Map<String, Integer> map = new TreeMap<>();
      StringTokenizer st;
      String extension;
      for(int i=0;i<N;i++){
         st = new StringTokenizer(in.readLine(),".");
         st.nextToken();
         extension = st.nextToken();
         map.put(extension,map.getOrDefault(extension,0)+1);
      }
      StringBuilder sb = new StringBuilder();
      for(Map.Entry<String, Integer> entry:map.entrySet()){
         sb.append(entry.getKey()).append(' ').append(entry.getValue()).append('\n');
      }
      System.out.print(sb);
   }
}

3. 결과

HashMap 사용한 후 keySet을 넣은 list를 정렬하는 것보다 TreeMap을 사용하는 게 더 메모리, 시간면에서 절약된다.

댓글