문제 링크 : https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
문제 내용 : 아래 더보기
더보기
- 문제
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
- 입력
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.
- 출력
문제에 나와있는 정렬 기준으로 정렬한 후 첫째 줄부터 N개의 줄에 걸쳐 각 학생의 이름을 출력한다.
정답 코드 ) 퀵 정렬 사용
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
class Student implements Comparable<Student> {
String name;
int korean, english, math;
public Student(String name, int korean, int english, int math) {
super();
this.name = name;
this.korean = korean;
this.english = english;
this.math = math;
}
@Override
public int compareTo(Student o) {
if (this.korean != o.korean)
return o.korean - this.korean;
if (this.english != o.english)
return this.english - o.english;
if (this.math != o.math)
return o.math - this.math;
return this.name.compareTo(o.name);
}
}
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));
int N = Integer.parseInt(br.readLine());
// N개의 데이터 입력 받기
Student[] students = new Student[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
students[i] = new Student(st.nextToken(), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
// 퀵 정렬로 정렬 수행
quickSort(students, 0, N - 1);
// 정렬된 학생 정보 출력
for (Student student : students) {
bw.write(student.name + "\n");
}
bw.flush();
br.close();
bw.close();
}
public static void quickSort(Student[] students, int start, int end) {
if (start >= end)
return;
int pivot = partition(students, start, end);
quickSort(students, start, pivot - 1);
quickSort(students, pivot + 1, end);
}
private static int partition(Student[] students, int start, int end) {
// 마지막 요소를 pivot으로 선택
Student pivot = students[end];
int i = start - 1; // pivot 이전의 마지막 요소의 인덱스 초기화
for (int j = start; j < end; j++) {
if (students[j].compareTo(pivot) <= 0) {
i++;
// pivot 왼쪽으로 이동, swap 교환
Student tmp = students[i];
students[i] = students[j];
students[j] = tmp;
}
}
// pivot swap
Student tmp = students[i + 1];
students[i + 1] = students[end];
students[end] = tmp;
return i + 1;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준/JAVA] 11728번 : 배열 합치기 (0) | 2024.03.27 |
---|---|
[백준/JAVA] 11651번 : 좌표 정렬하기 2 (0) | 2024.03.27 |
[백준/JAVA] 2750번 : 수 정렬하기 (0) | 2024.03.26 |
[백준/JAVA] 2447번 : 별 찍기 - 10 (0) | 2024.03.25 |
[백준/JAVA] 10870번 : 피보나치 수 5 (0) | 2024.03.25 |