본문 바로가기

문제 풀이/Baekjoon

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

문제 출처 - Baekjoon Online Judge

문제는 여기

 

20291번: 파일 정리

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

www.acmicpc.net

[문제] 

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


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


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

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

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

[입력]

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

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

[출력]

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

 

 


[풀이]

1. 확장자명을 잘라야 하는데 문자열을 자르기 위해서는 substring 또는 split을 생각할 수 있다.

2. split 보다는 substring을 사용하는 것이 위 문제에서는 편하기 때문에 substring으로 문자열을 .이후를 잘라준다.

3. 확장자명을 정렬해서 사용해야하기 때문에 treemap을 사용해준다.

4. 잘라서 나온 확장자명이 map에 있는지를 확인 후 없다면 value를 1로, 있다면 value를 현재 value + 1로 넣어준다.

5. 모든 입력이 끝나면 map을 출력해준다.

[접근]

1. 처음에는 .을 기준으로 잘라 확장자명들을 배열에 넣어서 해결하려고 생각하였다.

2. 하지만 .을 기준으로 잘라서 나온 확장자명을 key로 두고 나온 횟수를 value 값으로 생각하니 map을 사용해야겠다는 생각으로 바뀌었다.

3. map중에서도 자동으로 정렬을 해주는 treemap을 사용해서 문제를 해결해야겠다고 생각했다.

4. 확장자명, 횟수를 값을 map에 넣어주고 해당 맵을 출력해주었다.

[코드]

package BOJ_silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.TreeMap;

public class Main_S3_20291 {
	static int n;
	static Map<String, Integer> map = new TreeMap<String, Integer>();
	// 자동으로 정렬을 해주기 때문에 treemap을 사용

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < n; i++) {
			String name = br.readLine(); // 파일명을 다 입력받기
			// 입력받은 파일 명을 substring을 이용해 .이후부터 잘라내기
			String extension = name.substring(name.indexOf(".") + 1);
			
			// 이미 map에 있다면 해당 값을 1 증가 시키고
			if (map.containsKey(extension))
				map.put(extension, map.get(extension) + 1);
			else // 없다면 해당 값을 1로 넣어주기
				map.put(extension, 1);
		}
		
		// 결과 출력
		for(String key : map.keySet()) {
			System.out.println(key + " " + map.get(key));
		}
	}
}