https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
- 학생 N명의 국, 영, 수 점수
- 학생 성적 정렬하기
- 국어 점수 감소하는 순서
- 국어 점수 같으면 → 영어 점수 증가
- 국어, 영어 같으면 → 수학 점수 감소
- 모두 같으면 이름 사전순 증가 (모든 대문자는 소문자 앞에)
- 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.
💡 알고리즘
정렬
💡 접근
객체를 정렬하는 기준을 만들기 위해 자바에서 제공하는 Comparator를 사용해야 한다.
: Comparator 안에 조건문을 걸어주고 리턴시키면 위와같이 이중, 삼중으로도 정렬이 가능하다.
Arrays.sort(arr, new Comparator<String[]>() {
- arr[1].compareTo(arr[2]) : (호출한객체 > 파라미터 객체) 일 때 양수 리턴
- Integer.compare(arr[1], arr[2]) : 오름차순 정렬 (자리 바꾸면 내림차순)
💡 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class BOJ_10825 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][4];
for(int i = 0; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken();
arr[i][1] = st.nextToken();
arr[i][2] = st.nextToken();
arr[i][3] = st.nextToken();
}
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] s1, String[] s2) {
if (Integer.parseInt(s1[1]) == Integer.parseInt(s2[1])) {
if (Integer.parseInt(s1[2]) == Integer.parseInt(s2[2])) {
if (Integer.parseInt(s1[3]) == Integer.parseInt(s2[3])) {
// 국영수 모두 같을 때 -> 사전순
return s1[0].compareTo(s2[0]);
}
// 국영 같을 때 -> 수학 내림차순
return Integer.compare(Integer.parseInt(s2[3]), Integer.parseInt(s1[3]));
}
// 국어 같을 때 -> 영어 오름차순
return Integer.compare(Integer.parseInt(s1[2]), Integer.parseInt(s2[2]));
}
// 국어 내림차순
return Integer.compare(Integer.parseInt(s2[1]), Integer.parseInt(s1[1]));
}
});
for(int i = 0; i < N; i++){
System.out.println(arr[i][0]);
}
}
}
💡 정리
정렬 조건이 여러개 → Comparator 사용!!
'Algorithm > Sorting' 카테고리의 다른 글
[Python] 백준 #10989 수 정렬하기 3 (0) | 2022.03.03 |
---|