반응형
영어로 된 학생 이름, 국어 점수, 영어 점수, 수학 점수가 주어졌을때,
-
국어 점수가 감소하는 순서로
-
국어 점수가 같으면 영어 점수가 증가하는 순서로
-
국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
-
모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.
위와 같은 조건으로 정렬 하여, 학생 이름을 출력 하면 되는 문제 입니다. 1 <= N <= 100,000 이므로, 성적표(GradeCard) 클래스를 정의하고 Collections.sort()로 한번의 정렬 O(N logN) 으로 정렬하여 출력 할수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class BOJ10825 {
// https://www.acmicpc.net/problem/10825
// 국영수
// 1 <= N <= 100000
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
List<GradeCard> gradeCards = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String name = st.nextToken();
int korean = Integer.parseInt(st.nextToken());
int english = Integer.parseInt(st.nextToken());
int math = Integer.parseInt(st.nextToken());
GradeCard gradeCard = new BOJ10825().new GradeCard(name, korean, english, math);
gradeCards.add(gradeCard);
}
System.out.print(new BOJ10825().solution(N, gradeCards));
}
public String solution(int N, List<GradeCard> gradeCards) {
// 1. 국어 감소
// 2. 영어 증가
// 3. 수학 감소
// 4. 이름이 사전 순
// 위 순서대로 정렬 기준을 정해서 Arrays.sort()
// 한번 만 정렬
// 시간 복잡도 : O(n log n)
Collections.sort(gradeCards);
StringBuilder sb = new StringBuilder();
for (GradeCard gradeCard : gradeCards) {
sb.append(gradeCard.name).append(System.lineSeparator());
}
return sb.toString();
}
class GradeCard implements Comparable<GradeCard>{
String name;
int korean;
int english;
int math;
public GradeCard(String name, int korean, int english, int math) {
this.name = name;
this.korean = korean;
this.english = english;
this.math = math;
}
@Override
public int compareTo(GradeCard other) {
final int POSITIVE_NUM = 1;
final int NEGATIVE_NUM = -1;
if (korean < other.korean)
return POSITIVE_NUM;
else if (korean > other.korean)
return NEGATIVE_NUM;
if (english > other.english)
return POSITIVE_NUM;
else if (english < other.english)
return NEGATIVE_NUM;
if (math < other.math)
return POSITIVE_NUM;
else if (math > other.math)
return NEGATIVE_NUM;
// 영어 이름 알파베티컬 하게 비교
return name.compareTo(other.name);
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
공유기 설치 - 백준 2110번 (0) | 2020.09.22 |
---|---|
파일 통계 프로그램 (0) | 2020.09.21 |
기둥과 보 설치 - '2020 카카오 코딩 테스트' (0) | 2020.09.15 |
외벽 점검 - '카카오 2020 코딩 테스트' (0) | 2020.09.12 |
배열 합치기 - '백준 11728번' (0) | 2020.09.11 |