본문 바로가기
코테 - 자바

정렬 - 코딩테스트 JAVA

by BIGENGINEER 2025. 4. 28.

학생 인기도 측정

문제

학생 이름이 공백으로 구분된 문자열 A가 주어진다. 문자열 A에는 중복된 학생 이름이 존재하지 않는다. 학생 이름은 알파벳 소문자로 이루어져 있다. 각 학생이 좋아하는 학생의 학생 이름 목록이 공백으로 구분된 문자열로 주어진다. 각 학생이 좋아하는 학생은 1명 이상 주어지고, 내가 나를 좋아하는 예는 없다. 나를 좋아하는 학생이 많을수록 나의 인기도가 높다. 인기도가 높은 학생부터 낮은 학생 순으로 학생 이름과 해당 학생을 좋아하는 학생 수를 출력하자. 인기도가 같은 경우 학생 이름 기준으로 오름차순으로 출력하자.

입력

첫 번째 줄에 학생 수 n이 주어진다.

두 번째 줄에 n명의 학생 이름이 공백으로 구분된 문자열 A가 주어진다.

다음 줄부터 n개의 줄에 걸쳐 한 줄에 한 학생의 정보가 주어진다. 학생 정보는 문자열 A에 나온 학생 순서대로 주어진다. 한 명의 학생 정보는 해당 학생이 좋아하는 학생 이름이 공백으로 구분된 문자열로 주어진다.

출력

첫 번째 줄부터 n번째 줄까지 학생 이름과 해당 학생을 좋아하는 학생 수를 공백으로 구분하여 한 줄에 출력한다. 인기도가 높은 학생부터 낮은 학생 순으로 출력하고, 인기도가 같은 경우 학생 이름 기준으로 오름차순으로 출력한다.

제한

  • 3 ≤ n ≤ 100
  • 1 ≤ 학생 이름 길이 ≤ 10

예제 입력 1 

4
aaa bbb ccc ddd
bbb ddd
aaa ddd
aaa
aaa bbb

예제 출력 1 

aaa 3
bbb 2
ddd 2
ccc 0

 


 

1)

흠.. 학생 수 받아오고, 공백 기준으로 학생 이름 받아오면 되는데 

항상 헷갈린다. 이젠 기억 좀 하자

 

String[] name = sc.nextLine().split(" ");

 

-> for 문으로 받아와야되나 항상 고민했는데 위처럼 간단하게 받아오면 된다!!

 

 

 

2) 그 다음 인기도를 측정하기 위해 초기화를 해준다.

HashMap<String, Integer> popularity = new HashMap<>();
for(String names : name){
	popularity.put(names, 0);
}

 

 

 

3) 각 학생이 좋아하는 학생들 받아오고, 인기도 +1 

for(int i=0; i<n; i++){
	String[] love = sc.nextLine().split(" ");
    for(String loves : love){
    	popularity.put(loves, popularity.get(loves) +1);
    }
}

 

 

 

**질문

 

popularity.put(like, popularity.get(like) + 1); 여기에서 앞에 like는 이름인데, 어떻게 get(like)는 숫자가 돼?

 

-> popularity는 Map이므로 get(key)를 하게되면 value를 반환한다. 이때 value는 Integer 이므로 +1 이 가능함.

 

 

 

 

4) 정렬

 

자, 근데 정렬을 하기 위해서는 .sort()와 같은 간단한 함수를 사용하면 좋은데, 배열은 이렇게 못 사용하기 때문에 리스트로 변환해주어야 함.

 

ArrayList<String> arrayName = new ArrayList<>(Arrays.asList(names));

 

-> Arrays.asList(names)는 원래 크기 변경(추가, 삭제)가 불가능한 고정 리스트인데, 한 번 더 감싸줘서 유연한 리스트로 만들어 준 것임.

 

즉,

Arrays.asList(names)는 배열 → 리스트 변환
new ArrayList<>(...)는 편집 가능한 리스트를 만들려고 한 것!

 

 

 

 

< 전체 코드>

import java.util.*;

public class DAY19 {
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        //학생수
        int n = sc.nextInt();
        sc.nextLine();

        //학생 이름
        String[] names = sc.nextLine().split(" ");

        //인기도 초기화
        HashMap<String, Integer> popularity = new HashMap<>();
        for(String name : names){
            popularity.put(name,0);
        }

        //각 학생이 좋아하는 학생 입력 받고, 인기도 +1
        for(int i=0; i<n; i++){
            String[] love = sc.nextLine().split(" ");
            for(String loves : love){
                popularity.put(loves, popularity.get(loves) +1);
            }
        }

        //정렬
        ArrayList<String> arrayName = new ArrayList<>(Arrays.asList(names));
        arrayName.sort((a,b) ->{
            if (popularity.get(b) != popularity.get(a)) { 
                return popularity.get(b) - popularity.get(a); //내림차순
            }else{
                return a.compareTo(b); //오름차순
            }
        });


        for(String name : arrayName){
            System.out.println(name + " " + popularity.get(name));
        }

    }
}

 

 

 

 

 

아앍 map에서 값 얻어오는것.

정렬하는 것.

오름차순 내림차순 정확하게 기억하기