안녕하세요. pitang입니다.
백준 10825번 국영수 문제를 풀어보겠습니다.
10825번 국영수
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다.
다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성.
1. 국어 점수가 감소하는 순서로
2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
3. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로
(단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
입력은 첫째 줄에 도현이네 반의 학생의 수 N이 주어지고,
둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어짐.
점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.
출력은 문제에 나와있는 정렬 기준으로 정렬한 후 첫째 줄부터 N개의 줄에 걸쳐 각 학생의 이름을 출력한다.
예제 입력 | 예제 출력 |
4 | |
Junkyu 50 60 100 | Sangkeun |
Sangkeun 80 60 50 | Sunyoung |
Sunyoung 80 70 100 | Junkyu |
Soong 50 60 90 | Soong |
풀이
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 Main {
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];
StringTokenizer st;
for(int i = 0; i < N; i++) {
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[]>() {
// compare 함수 잘 알아보기.
@Override
public int compare(String[] o1, String[] o2) {
// TODO Auto-generated method stub
if(o2[1].equals(o1[1])) {
if(o1[2].equals(o2[2])) {
if(o1[3].equals(o2[3])) {
return o1[0].compareTo(o2[0]);
}
return Integer.parseInt(o2[3]) - Integer.parseInt(o1[3]);
}
return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]);
}
return Integer.parseInt(o2[1]) - Integer.parseInt(o1[1]);
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
sb.append(arr[i][0]).append("\n");
}
System.out.println(sb);
br.close();
}
}
-> 국어, 영어, 수학 순으로 정렬해야한다는 것을 기억해야 한다.
Comparable과 Comparator
두개 모두 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스이다. 즉, 객체를 비교하고자 할 때 쓰인다.
Comparable 기본 정렬기준을 구현하는데 사용, compareTo 메소드를 반드시 구현해야 한다.
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용한다.
깊게 알아보려면 더 알아볼 수 있지만 내가 이해하고 쉽게 정리한 설명은 아래와 같다.
compareTo(object o) -> o하고 this(자신)를 비교한다.
compare(object o1, object o2) -> o1과 o2를 비교하고 양수면 왼쪽이 큼, 음수면 오른쪽이 큼, 0이면 같은 결과를 제공한다.
자바에서의 정렬은 특별한 정의가 있지 않는 한 '오름차순'을 기준으로 한다.
그렇기에 기본적으로 음수일 경우 교환을 하지 않고, 양수일 경우 교환을 한다. 이로써 정렬이 진행되는 것이다.
* m1 맥북을 사용 중입니다.*
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 - 10828번, 10845번, 10866번 스택, 큐, 덱 (개념까지!) (0) | 2022.09.17 |
---|---|
[JAVA] 백준 - 11650번 좌표 정렬하기 (0) | 2022.09.15 |
[JAVA] 백준 - 10844번 쉬운 계단 수 (동적계획법 설명 추가!) (0) | 2022.03.17 |
[JAVA] 백준 - 1110번 더하기 사이클 (0) | 2022.01.31 |
[JAVA] 백준 - 10952번 A+B, 10951번 A+B (0) | 2022.01.31 |