요약
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를 사용한다.
- 클래스에 implements Comparable<클래스명> 을 붙인다.
- @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();
}
}