728x90
문제설명
입력 & 출력
나의 풀이
이번 문제는 간단하게 파일을 확장자까지 입력받고 확장자 별로 몇 개가 있는지 구분하는 문제입니다. 그리고 확장자의 개수가 아닌 확장자를 사전순으로 정렬하여 출력하면 되는 문제입니다.
사전순 출력 == 오름차순 출력
"apple", "banana", "cat", "dog",...
문제를 딱 보면 HashSet을 사용하기에 적합합니다. 먼저 빠른 입력을 위해 BufferedReader클래스를 사용하여 입력을 받아주고, 확장자를 구분하기 위해서 StringTokenizer를 사용하여 token별로 구분해 줍니다.
이때 split() 메서드를 사용하여 '.'을 기준으로 분리해 줍니다.
"\\."은 정규표현식에서 사용되는 패턴입니다.
이 표현은 백슬래시(\)로 점(.)을 이스케이프(escape) 한 것이며, 정규표현식에서 점(.)은 어떤 문자 하나를 의미하는 메타문자입니다. 따라서 파일명에서 확장자를 구분하기 위해 점(.)을 구분자로 사용하려면 이스케이프 처리를 해야 합니다.
그리고 HashMap에 getOrDefault() 메서드를 사용하여 키(key)로 저장된 값(value)을 가져와서, 기존 값이 없으면 기본값인 0을 사용하고, 기존 값이 있으면 기존 값에 1을 더한 후 다시 map에 저장합니다.
이는 해당 확장자가 몇 번 등장했는지를 세는 용도로 사용될 수 있습니다.
- map.entrySet(). stream()
- map의 각 엔트리(entry)를 스트림으로 변환합니다. 각 엔트리는 키(key)와 값(value)의 쌍으로 구성됩니다.
- . sorted((e1, e2) -> e1.getKey(). compareTo(e2.getKey()))
- 스트림을 정렬합니다.
- 여기서 e1과 e2는 Map.Entry <String, Integer> 타입의 객체입니다.
- getKey() 메서드를 사용하여 엔트리의 키(key)를 비교하고, compareTo() 메서드를 사용하여 오름차순으로 정렬합니다. 따라서 키(key)를 사전순으로 정렬됩니다.
- . forEach(el -> System.out.println(el.getKey() + " " + el.getValue()))
- 정렬된 각 엔트리에 대해 출력합니다.
- el.getKey()는 엔트리의 키(key)를 반환하고, el.getValue()는 해당 키에 대응하는 값(value)을 반환합니다. 이들을 문자열로 조합하여 출력합니다.
다른 풀이✅
다른 풀이에서는 "나의 풀이"와 비슷한 맥락이지만, Stream을 사용하지 않고 keySet() 메서드를 사용하여 key들을 가져오고, list로 변환한 후 Collections의 sort() 메서드를 사용하여 오름차순(디폴트 값)으로 정렬합니다.
마지막으로 list를 반복문으로 순회하여 출력하여 마무리했습니다.
속도는 keySet()을 사용한 코드가 더 빠릅니다.
참고❗️