문제설명
입력 & 출력
나의 풀이
이번 문제는 각 학생이 좋아하는 학생의 학생 이름 목록이 공백으로 구분된 문자열로 주어질 때 좋아하는 사람을 체크한 후 인기도가 높은 학생부터 낮은 학생 순으로 출력(내림차순)하고, 인기도가 같은 경우 학생 이름 기준으로 오름차순으로 출력하는 문제입니다.
먼저 빠른 입력을 위해 BufferedReader클래스를 사용하여 입력을 받아주고, StringTokenizer를 사용하여 공백을 기준으로 분리해 줍니다.
첫째 줄에 주어진 학생을 map에 넣어주고, 각 학생들이 좋아하는 학생의 정보를 토큰으로 받아 while문에서 token이 더 이상 토큰을 가지고 있지 않을 때까지 반복합니다.
token.hasMoreTokens() 메서드
▪️ token에 다음 토큰이 있는지 여부를 확인합니다.
▪️ 토큰이 있으면 true, 없으면 false를 반환합니다. 따라서 이 while루프는 token의 모든 토큰을 처리할 때까지 반복됩니다.
좋아하는 학생을 name으로 받고, getOrDefault() 메서드를 사용하여 name이 map에 존재하면 해당 값(value)에 1을 더하여 업데이트하고, 존재하지 않으면 0을 기본값으로 설정합니다.
map.entrySet()
.stream()
.sorted((e1,e2) -> {
// e2 == 선택 인기도 내림차순
int popularity = e2.getValue().compareTo(e1.getValue());
// 인기도가 같으면(0) e1선택 == 오름차순
return popularity == 0 ? e1.getKey().compareTo(e2.getKey()) : popularity;
})
.forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue()));
map의 엔트리(키-값 쌍)를 스트림으로 변환하고 난 뒤
- . sorted((e1, e2) -> {... })
- 스트림의 엔트리를 정렬합니다.
- e1과 e2는 Map.Entry <String, Integer> 타입의 객체로, 각각 key와 value를 가지고 있습니다.
- int popularity = e2.getValue(). compareTo(e1.getValue());
- 먼저 인기도(value)를 비교합니다.
- e2.getValue(). compareTo(e1.getValue())는 내림차순 정렬을 의미합니다.
- compareTo 메서드는 기본적으로 오름차순 정렬을 수행하므로, e2와 e1의 순서를 바꾸면 내림차순 정렬이 됩니다.
- return popularity == 0? e1.getKey(). compareTo(e2.getKey()) : popularity;
- 만약 인기도가 같다면(popularity == 0), 이름(key)을 오름차순으로 정렬합니다.
참고❗️
[JAVA] 입출력, BufferedReader, StringTokenizer, StringBuilder 알아보기
Java로 코딩테스트를 보거나 입력을 사용해야 할 때 Scanner 클래스를 사용하면 편리하지만 속도가 느리다는 단점이 있습니다. 그렇기 때문에 속도가 빠른 BufferReader 클래스를 사용을 하면 시간복
pixx.tistory.com
[JAVA] HashMap 이란 ❓ (1/2)
Java에서 데이터를 효율적으로 저장하고 빠르게 검색하기 위해 다양한 컬렉션 클래스가 제공됩니다. 그중에서도 HashMap은 키-값 쌍을 저장하고 관리하는 데 있어 매우 유용한 데이터 구조
pixx.tistory.com
[JAVA] HashMap_entrySet() : 데이터 접근과 반복을 간편하게 하는 방법(2/2)
Java를 활용하다 보면 종종 데이터를 매핑하는 작업이 필요한 경우가 있습니다. 특히 맵(Map)을 사용할 때는 맵에 저장된 모든 엔트리(키-값 쌍)에 접근하는 것이 중요합니다. 이때 유용하게 사
pixx.tistory.com