Seren dev's blog
article thumbnail

https://www.acmicpc.net/problem/20291

 

20291번: 파일 정리

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

www.acmicpc.net

풀이

map을 사용하여 (확장자 이름, 파일 개수)를 저장한다.

또한 확장자는 사전순을 출력해야 하므로 확장자를 정렬하기 위해, 확장자 이름은 따로 ArrayList에 저장한 다음 이후 정답을 출력할 때 사용한다.

 

로직

1. HashMap<String, Integer> map과 ArrayList<String> list를 선언한다.

2. 파일을 입력받고 파일의 확장자 이름을 뽑아낸다.

3. 확장자 이름이 map의 키로 존재한다면, 해당 엔트리의 값을 1 증가한다. 존재하지 않으면 map에 추가하고, list에 확장자 이름을 추가한다.

4. list를 정렬한다.

5. for each 문을 사용하여 list의 확장자 이름과 map에 저장된 파일 개수를 출력한다.

 

코드

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());
		
		HashMap<String, Integer> map = new HashMap<>();
		ArrayList<String> list = new ArrayList<>();
		
		for (int i = 0; i < n; i++) {
			String file = br.readLine();
			
			int idx = file.indexOf('.');
			
			String ex = file.substring(idx+1); // 확장자 이름
			
			// 이미 있는 확장자
			if (map.containsKey(ex)) {
				map.put(ex, map.get(ex)+1);
			}
			// 새로운 확장자
			else {
				map.put(ex, 1);
				list.add(ex);
			}
		}
		
		Collections.sort(list);
		
		StringBuilder sb = new StringBuilder();
		for (String ex: list) {
			sb.append(ex+ " " + map.get(ex) + "\n");
		}
		System.out.println(sb);
	}
	
}

 


다른 풀이 2

StringBuilder를 사용해 출력하는 것보다 BufferedWriter를 사용하여 출력할 수 있다. 로직은 위와 같다.

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		
		HashMap<String, Integer> map = new HashMap<>();
		ArrayList<String> list = new ArrayList<>();
		
		for (int i = 0; i < n; i++) {
			String file = br.readLine();
			
			int idx = file.indexOf('.');
			
			String ex = file.substring(idx+1); // 확장자 이름
			
			// 이미 있는 확장자
			if (map.containsKey(ex)) {
				map.put(ex, map.get(ex)+1);
			}
			// 새로운 확장자
			else {
				map.put(ex, 1);
				list.add(ex);
			}
		}
		
		Collections.sort(list);
		

		for (String ex: list) {
			bw.write(ex+ " " + map.get(ex) + "\n");
		}
		bw.flush();
		bw.close();
		br.close();
	}
	
}

 


다른 풀이 3

HashMap을 사용하는 대신 key의 타입에 따라 자동 정렬되는 TreeMap을 사용한다.

TreeMap을 사용하면 확장자의 이름을 따로 저장하기 위한 ArrayList를 사용할 필요가 없다.

 

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		
		TreeMap<String, Integer> map = new TreeMap<>();
		
		for (int i = 0; i < n; i++) {
			String file = br.readLine();
			
			int idx = file.indexOf('.');
			
			String ex = file.substring(idx+1); // 확장자 이름
			
			map.put(ex, map.getOrDefault(ex, 0) + 1);
		}

		for (Map.Entry<String, Integer> entry : map.entrySet()) {
			bw.write(entry.getKey()+ " " + entry.getValue() + "\n");
		}
		bw.flush();
		bw.close();
		br.close();
	}
	
}

 

StringBuilder를 사용하는 대신 BuffereWriter를 사용하는 것이 메모리를 더 적게 사용하고, 3번째 방법이 메모리와 실행 시간 측면에서 더 좋은 코드인 것을 확인할 수 있다.

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!