본문 바로가기
Algorithm(코딩테스트)/코딩테스트 | 기초 개념 시리즈

[JAVA] 정렬

by 카랑현석 2024. 12. 5.

요약

1) 일반 정렬 문법을 학습한다.

2) 객체 정렬 / 정렬 커스텀마이징을 한다. (Comparable 인터페이스 , compareTo 메서드 사용)

3) 여러 개의 정렬 커스텀마이징을 한다. (Comparator 인터페이스 , compare 메서드 사용)

 

1) 일반 정렬

[문법]

  • 단순한 오름차순/내림차순 정렬에 활용
  • 내림차순 정렬은 wrapper 자료형만 가능 (wrapper 자료형 : Integer과 같이 자료형이 대문자로 시작하는 것)
  배열 ArrayList
오름차순 정렬 Arrays.sort(arr) Collections.sort(list)
내림차순 정렬 Arrays.sort(arr, Collections.reverseOrder()) Collections.sort(arr, Collections.reverseOrder())
문자열 → 문자 배열 str.toCharArray() 이용

Ex)
String str = “abc”;
char[] charArr = str.toCharArray();
 


[빈출 유형]

  • 동일한 수열인지 판별
  • 특정 개수로 묶었을 때 최소, 최대가 되도록하는 유형
  • 중앙값, 최빈값 구하기
코드트리_두 개의 동일한 수열 https://www.codetree.ai/missions/5/problems/two-equal-series/description #정렬 응용(동일한 수열 판별)
코드트리_2개씩 그룹짓기 https://www.codetree.ai/missions/5/problems/group-of-pairs/description #정렬 응용(특정 개수로 묶었을 때 최소, 최대가 되도록하는 유형)
⭐코드트리_순서를 바꾸었을 때 같은 단어인지 판별하기 https://www.codetree.ai/missions/5/problems/determine-same-word/description #정렬 응용(동일한 수열 판별)
⭐코드트리_k번째로 신기한 문자열 https://www.codetree.ai/missions/5/problems/kth-special-string/description #정렬
#문자열 함수
코드트리_중앙값 계산 2 https://www.codetree.ai/missions/5/problems/get-median-2/description #정렬 응용(중앙값 구하기)

 

2) 객체 정렬 / 정렬 커스텀마이징

[문법]

  • 정렬을 해야 하는 조건이 복잡한 경우 사용
  • Comparable interface를 사용한다.
  •  
  1. 클래스에 implements Comparable<클래스명> 을 붙인다.
  2. @Override를 통해 compareTo 함수를 정의한다. 
import java.util.*;
import java.io.*;

class Agent implements Comparable<Agent> {
    String codeName;
    Integer score;

    public Agent() {
        codeName = "";
        score = 0;
    }

    public Agent(String codeName, int score) {
        this.codeName = codeName;
        this.score = score;
    }

    // 정렬
    @Override
    public int compareTo(Agent other) {
    // 참고 : 오름차순 정렬은 this 가 먼저 나오고 내림차순 정렬은 other 이 먼저 나온다.
    // 자료형 상관 없이 가능
        return this.score -other.score; // 점수를 기준으로 오름차순 정렬
        // return this.codeName - other.codeName; // codeName 기준으로 오름차순 정렬
    }
};

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

        Agent[] agents = new Agent[5]; // 배열 형태
        // ArrayList<Agent> agent = new ArrayList<>(); // ArrayList 형태
        for(int i=0; i<5; i++) {
            String input = br.readLine();
            StringTokenizer st = new StringTokenizer(input, " ");
            String code = st.nextToken();
            int s = Integer.parseInt(st.nextToken());
            agents[i] = new Agent(code, s);
        }

        // 점수가 가장 낮은 Agent의 정보 출력 하려면?
        Arrays.sort(agents); // 배열 형태일 때 정렬
        // Collections.sort(agents); // ArrayList 형태 일때 정렬
        
        bw.write(String.format("%s %d", agents[0].codeName, agents[0].score));
        bw.flush();
        bw.close();
    }
}

 

[빈출 유형]

코드트리_코드네임 https://www.codetree.ai/missions/5/problems/code-name/introduction #객체 정렬
코드트리_사는 지역 https://www.codetree.ai/missions/5/problems/where-live/description #객체 정렬
코드트리_비오는 날 https://www.codetree.ai/missions/5/problems/rainy-day/description #객체 정렬
코드트리_국영수 순이지 https://www.codetree.ai/missions/5/problems/korean-english-math-order/description #객체 정렬(정렬 커스텀마이징)
코드트리_총점 비교 https://www.codetree.ai/missions/5/problems/compare-total-points/description #객체 정렬(정렬 커스텀마이징)
⭐코드트리_줄 세우기 https://www.codetree.ai/missions/5/problems/line-up-students/description #객체 정렬(정렬 커스텀마이징)
⭐코드트리_원점으로부터의 거리 https://www.codetree.ai/missions/5/problems/distance-from-origin/description #객체 정렬(정렬 커스텀마이징)
⭐⭐⭐코드트리_정렬된 숫자 위치 알아내기 https://www.codetree.ai/missions/5/problems/indices-of-sorted-array/description #객체 정렬(정렬 커스텀마이징)
#배열의 인덱스 성질 활용

 

3) 커스텀 해야되는 정렬이 여러개인 경우

  • Comparator interface를 직접 여러 개 만들 수 있다.
  • compare 메서드를 사용한다.
package hihi;

import java.util.*;
import java.io.*;

class Agent {
    String codeName;
    Integer score;

    public Agent() {
        codeName = "";
        score = 0;
    }

    public Agent(String codeName, int score) {
        this.codeName = codeName;
        this.score = score;
    }
};

// 정렬 커스텀마이징1 - codeName 값을 기준으로 오름차순 정렬
class AgentCodeNameSort implements Comparator<Agent> {
	@Override
	public int compare(Agent agent1, Agent agent2) {
		return agent1.codeName.compareTo(agent2.codeName);
	}
};

// 정렬 커스텀마이징2 - score 값을 기준으로 오름차순 정렬
class AgentScoreSort implements Comparator<Agent> {
	@Override
	public int compare(Agent agent1, Agent agent2) {
		return agent1.score.compareTo(agent2.score);
	}
}

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

        Agent[] agents = new Agent[5]; // 배열 형태
        // ArrayList<Agent> agent = new ArrayList<>(); // ArrayList 형태
        for(int i=0; i<5; i++) {
            String input = br.readLine();
            StringTokenizer st = new StringTokenizer(input, " ");
            String code = st.nextToken();
            int s = Integer.parseInt(st.nextToken());
            agents[i] = new Agent(code, s);
        }

        // 배열 형태일 때 정렬
        Arrays.sort(agents, new AgentCodeNameSort()); // 정렬 커스텀마이징1 사용 - codeName 값을 기준으로 오름차순 정렬
        Arrays.sort(agents, new AgentScoreSort()); // 정렬 커스텀마이징2 사용 - score 값을 기준으로 오름차순 정렬
        // Collections.sort(agents); // ArrayList 형태 일때 정렬
        
        bw.write(String.format("%s %d", agents[0].codeName, agents[0].score));
        bw.flush();
        bw.close();
    }
}