728x90
문제설명
입력 & 출력
나의 풀이
이번 문제는 각 학생이 좋아하는 학생의 학생 이름 목록이 공백으로 구분된 문자열로 주어질 때 좋아하는 사람을 체크한 후 인기도가 높은 학생부터 낮은 학생 순으로 출력(내림차순)하고, 인기도가 같은 경우 학생 이름 기준으로 오름차순으로 출력하는 문제입니다.
먼저 빠른 입력을 위해 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)을 오름차순으로 정렬합니다.
참고❗️