백준: 20920(영단어 암기는 괴로워)

강지안·2023년 7월 3일
0

baekjoon

목록 보기
82/186

문제

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;

public class q20920 {
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] inputNM = br.readLine().split(" ");

        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<Integer.parseInt(inputNM[0]); i++) {
            String input = br.readLine();
            if(input.length() >= Integer.parseInt(inputNM[1])) {
                if(map.containsKey(input)) {
                    map.put(input, map.get(input) + 1);
                } else {
                    map.put(input, 1);
                }
            }
        }

        // 1. 알파벳 사전순
        ArrayList<String> keyList = new ArrayList<>(map.keySet());
        keyList.sort(Comparator.naturalOrder());

        // 2. 길이가 긴 순
        keyList.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length() - o1.length();
            }
        });

        // 3. 자주 나오는 순
        keyList.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return map.get(o2) - map.get(o1);
            }
        });

        for(String key : keyList) {
            bw.write(key+"\n");
        }
        bw.flush();
    }
}

학습

정렬 기준을 직접 오버라이딩 하는 법

.sort(new Comparator<String>() {
	@Override
    pubic int compare(String s1, String s2) {
    	return 정렬 기준
    }
});

예시

길이가 긴 순으로 정렬하고 싶다면
정렬 기준이 s2.length() - s1.length()가 되어야 한다.
길이가 짧은 순으로 정렬하고 싶다면
정렬 기준이 s1.length() - s2.length()가 되어야 한다.

아직 a-b가 왜 오름차순이고, b-a가 내림차순인지 정확하게 짚이지 않는다..

User

3이랑 9를 정렬할거야
근데 a -b 는 음수가 나와야 하잖아.
a=3, b=9일 때 음수가 나오니까 a -b는 오름차순 정렬이야?

ChatGPT

네, 맞습니다. a - b에서 a와 b가 각각 3과 9인 경우 3 - 9는 -6이 되어 음수가 됩니다. 따라서, a - b는 오름차순 정렬을 나타냅니다.

오름차순 정렬에서는 작은 값이 먼저 오도록 정렬되어야 합니다. a - b에서 a가 b보다 작을 때는 음수가 반환되어 정렬 순서가 유지됩니다. 따라서, a가 3이고 b가 9인 경우에는 3 - 9에서 음수인 -6이 반환되어 3이 9보다 작다는 것을 나타내어 정렬 결과는 오름차순으로 나옵니다.

따라서, a - b가 음수를 반환할 때는 오름차순 정렬이 이루어집니다.

User

만약 a=9, b=3이면 a-b는 양수가 나오잖아. 그럼 어떡해?

ChatGPT

맞습니다. 만약 a가 9이고 b가 3인 경우에는 a - b는 양수인 6이 됩니다. 따라서, a - b는 양수를 반환하게 되어서 오름차순 정렬을 나타내지 않습니다.

만약 내림차순으로 정렬하고 싶다면, 비교식을 b - a로 변경하면 됩니다. b - a는 b가 a보다 작을 때 양수를 반환하므로, 내림차순 정렬을 위한 비교식이 됩니다.

따라서, a가 9이고 b가 3인 경우에는 b - a에서 양수인 6이 반환되어 정렬 결과는 내림차순으로 나옵니다.

정리하면, a - b가 양수를 반환할 때는 오름차순 정렬이 이루어지고, b - a가 양수를 반환할 때는 내림차순 정렬이 이루어집니다. 따라서, 원하는 정렬 순서에 맞게 비교식을 선택하여 사용하면 됩니다.

User

그럼 내림차순은 무조건 양수여야 하고, 오름차순은 무조건 음수여야 해?

ChatGPT

정확한 말씀드리자면, 내림차순을 위한 비교식에서는 반환값이 양수여야 합니다. 오름차순을 위한 비교식에서는 반환값이 음수여야 합니다.

내림차순 정렬을 위해 사용되는 비교식에서는 비교 결과가 양수인 경우 두 요소의 순서를 바꾸어야 합니다. 따라서, 비교식의 결과가 양수인 경우에는 두 요소를 교환하여 정렬된 결과를 얻게 됩니다.

오름차순 정렬을 위해 사용되는 비교식에서는 비교 결과가 음수인 경우 두 요소의 순서를 바꾸지 않고 그대로 둬야 합니다. 따라서, 비교식의 결과가 음수인 경우에는 요소의 순서가 유지되어 정렬된 결과를 얻게 됩니다.

결론적으로, 내림차순을 위한 비교식에서는 반환값이 양수이어야 하며, 오름차순을 위한 비교식에서는 반환값이 음수이어야 합니다. 이를 통해 올바른 정렬 순서를 유지할 수 있습니다.

0개의 댓글