✔ 난이도 - Silver 3
그냥 . 기준으로 StringTokenizer로 나누고, HashMap 사용해서 확장자와 그 갯수를 세면 된다.
그러고 정렬하면 끝!
https://velog.io/@seha01130/HashMap이란-메소드-종류-정리
https://velog.io/@seha01130/JAVA-HashMap-정렬하기
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
Map<String, Integer> hm = new HashMap<String, Integer>();
for (int i = 0; i < T; i++){
st = new StringTokenizer(br.readLine(), ".");
st.nextToken();
String ext = st.nextToken();
hm.put(ext, hm.getOrDefault(ext, 0) + 1);
}
ArrayList<Map.Entry<String, Integer>> list = new ArrayList<>(hm.entrySet());
list.sort((a, b) -> a.getKey().compareTo(b.getKey()));
for(Map.Entry<String, Integer> entry: list){
sb.append(entry.getKey()).append(' ').append(entry.getValue()).append('\n');
}
System.out.println(sb);
}
}

문제에
점은 정확히 한 번 등장하며, 파일 이름의 첫 글자 또는 마지막 글자로 오지 않는다.
라는 요구사항이 있어서 그냥 이렇게 간단하게 풀었지만 만약에 . 이 여러번 올 수 있다면 어떨까?
만약 first.tar.gz 라는 확장자가 있을 때 .tar.gz를 확장자로 줘야한다면
StringTokenizer(..., ".")는 first, tar, gz 세 개로 쪼갠다.
따라서 이게 아니라, indexOf 함수를 쓰면 된다.
indexOf는 문자열의 맨 앞에서부터 .을 찾기 때문에 정확히 첫 번째 점의 위치를 알려준다.
String input = br.readLine();
int firstDotIdx = input.indexOf('.');
String ext = input.substring(firstDotIdx+1); //'.' + 1 위치부터 끝까지 잘라냄
hm.put(ext, hm.getOrDefault(ext, 0) + 1);
만약 가장 마지막 점
.을 기준으로 자른다면 lastIndexOf를 쓰면 되겠죠!
O(NlogN)