https://www.acmicpc.net/problem/20291
문제
친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를 확인할 수 있었다.
바탕화면의 파일들에는 값진 보물에 대한 정보가 들어 있어. 하나라도 지우게 된다면 보물은 물론이고 다시는 노트북을 쓸 수 없게 될 거야. 파일들을 잘 분석해서 보물의 주인공이 될 수 있길 바랄게. 힌트는 “확장자”야.
화가 났던 스브러스는 보물 이야기에 금세 화가 풀렸고 보물의 정보를 알아내려고 애썼다. 하지만 파일이 너무 많은 탓에 이내 포기했고 보물의 절반을 보상으로 파일의 정리를 요청해왔다. 스브러스의 요청은 다음과 같다.
- 파일을 확장자 별로 정리해서 몇 개씩 있는지 알려줘
- 보기 편하게 확장자들을 사전 순으로 정렬해 줘
그럼 보물의 절반을 얻어내기 위해 얼른 스브러스의 노트북 파일 정리를 해줄 프로그램을 만들자!
입력
첫째 줄에 바탕화면에 있는 파일의 개수 N 이 주어진다. (1≤N≤50 000 )
둘째 줄부터 N.)으로만 구성되어 있다. 점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다. 각 파일의 이름의 길이는 최소 3, 최대 100 이다. 개 줄에 바탕화면에 있는 파일의 이름이 주어진다. 파일의 이름은 알파벳 소문자와 점(
출력
확장자의 이름과 그 확장자 파일의 개수를 한 줄에 하나씩 출력한다. 확장자가 여러 개 있는 경우 확장자 이름의 사전순으로 출력한다.
문제 풀이
백준에서 실버 문제에 도전한 이후에 처음으로 첫트에 맞춘 문제!!
뭐...문제가 쉬워서 그런걸수도 있지만 그래도 한번에 맞추는 날도 오다니 굉장히 만족스러웠던 문제ㅋㅋ
사실 문제 자체가 굉장히 간단하다. 아래의 3가지만 기억하면서 코딩하면 된다.
1. 입력받는 내용은 파일명.확장자 임으로 .(점) 을 기준으로 str 을 나눠서 저장한다.
2. 동일한 확장자 명을 갖는 파일이 총 몇개나 있는지 확인해야한다. 이때 확장자는 변하지 않지만 확장자의 갯수만 변한다. => 확장자를 key, 파일의 갯수를 value 로 두고 map을 만들어서 계산하자
3. 확장자의 이름을 사전순으로 출력한다 => 확장자의 이름을 오름차순으로 정렬한다 => 확장자를 ArrayList 에 따로 담아두고 Collections.sort 를 사용해서 정렬한다!
나머지는 코드 주석 확인!
package baekJoon;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class Quiz_20291 {
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());
// 확장자와 갯수를 저장하는 map
HashMap<String, Integer> map = new HashMap<String, Integer>();
// 확장자만 저장하는 배열 => 확장자를 정렬하기 위한 배열
ArrayList<String> arr = new ArrayList<>();
for(int i=0; i<n; i++){
String str = br.readLine().split("\\.")[1];
// System.out.println("str : " + str.toString());
// map 의 getOrDefault 메서드를 이용해서 str 이라는 키로 map 을 조회했을 때 value 가 이미 있다면
// 해당 값을 가져오고, 아니면 0 을 return 한다.
// 이후 +1 을한다.
map.put(str, map.getOrDefault(str, 0)+1);
}
// map 에서 key 들만 가져와서 ArrayList 에 저장
for(String s : map.keySet()) {
arr.add(s);
}
// 확장자 정렬 => 기본 오름차순 정렬
Collections.sort(arr);
// 정렬한 arr 에서 하나의 값을 꺼내온 후 해당 값을 key 로 두고
// 다시 map 에서 해당 key 에 맞는 value 를 꺼내온다
for (String str : arr) {
bw.write(str + " " + map.get(str)+"\n");
}
bw.flush();
}
}
'Java - 알고리즘' 카테고리의 다른 글
백준 - 11652 카드 (0) | 2022.08.20 |
---|---|
백준 - 3055 탈출 (0) | 2022.08.19 |
백준 - 10825 국영수 (0) | 2022.08.18 |
백준 - 7568 덩치 (0) | 2022.08.18 |
백준 - 14226 이모티콘 (0) | 2022.08.15 |
댓글