https://www.acmicpc.net/problem/20291
[문제]
친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를 확인할 수 있었다.
바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.
화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다. 스브러스의 요청은 다음과 같다.
- 파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
- 보기 편하게 확장자들을 사전 순으로 정렬해 줘
그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!
[입력 조건]
- 첫째 줄에 바탕화면에 있는 파일의 개수 N이 주어진다. (1≤N≤50 000)
- 둘째 줄부터 N개 줄에 바탕화면에 있는 파일의 이름이 주어진다. 파일의 이름은 알파벳 소문자와 점(.)으로만 구성되어 있다. 점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다. 각 파일의 이름의 길이는 최소 3, 최대 100이다.
[코드]
import java.util.*;
public class BaekJoon_20291 {
static Map<String,Integer> map=new TreeMap<>();
static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int i=0;i<n;i++) {
String str=sc.next();
// 입력된 파일명을 "." 이후로 잘라 확장자만 얻는다.
String temp=str.substring(str.indexOf(".")+1);
// 이미 있는 확장자라면 해당 확장자의 값을 1늘려 삽입한다.
if(map.containsKey(temp))
map.put(temp, map.get(temp)+1);
// 없는 확장자라면 개수를 1로 count 한뒤 삽입한다.
else
map.put(temp, 1);
}
// Map에 저장된 확장자 명(key)과, 확장자 별 파일 개수(value->map.get(key))를 출력한다.
for(String key:map.keySet())
System.out.println(key+" "+map.get(key));
}
}
[고찰]
이번 문제는 Map 자료구조를 사용하면 쉽게 해결 할 수 있는 문제였다. 입력된 파일명에 substring() 함수를 사용하여 확장자만 얻어낸 후 이미 저장된 확장자라면 해당 확장자를 갖는 파일의 개수를 1늘려 삽입하고, 저장되지 않은 확장자하면 파일 개수를 1개로 설정한 뒤 삽입한다.
이때 Map에는 두 개의 값인 파일명과 파일의 개수를 저장할 수 있는데 파일명이 key가 되고 파일의 개수가 value가 된다. Map에 저장된 값을 출력하기 위해서는 key와 key에 따른 value를 map.get(key) 함수를 사용하여 얻을 수 있다. 이번 문제는 Map의 사용법을 익힌 문제였다.
'백준' 카테고리의 다른 글
[백준_16956번] 늑대와 양 (0) | 2021.08.24 |
---|---|
[백준_18429번] 근손실 (0) | 2021.08.23 |
[백준_1956번] 운동 (0) | 2021.08.23 |
[백준_2668번] 숫자고르기 (0) | 2021.08.23 |
[백준_15663번] N과 M (9) (0) | 2021.08.23 |