[Algorithm/Java] 백준 정렬 대표 문제 정리
🎯 정렬 정리
// 숫자 배열 정렬
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
// 문자열 배열 정렬
Arrays.sort(arr, (a, b) -> a[0].compareTo(b[0])); // 문자열 기준
// 복합 조건
Arrays.sort(arr, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1]; // 1차 기준
return a[0] - b[0]; // 2차 기준
});
숫자 배열 정렬
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
// 문자열 배열이면: Arrays.sort(arr, (a, b) -> Integer.parseInt(a[0]) - Integer.parseInt(b[0]));
a
→ 정렬 대상 배열의 어떤 한 행 (예:{"21", "Junkyu"}
)b
→ 다른 한 행 (예:{"20", "Dohyun"}
)- 숫자는 뺄셈으로 비교 가능
문자열 배열 정렬
a[0]
,b[0]
는 문자열이라서-
연산 불가하므로,compareTo
를 써야 한다.
a[0].compareTo(b[0])
= 사전순 오름차순b[1].compareTo(a[1])
= 사전순 내림차순
Arrays.sort(arr, (a, b) -> a[0].compareTo(b[0])); // 문자열 기준
복합 조건
Arrays.sort(arr, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1]; // 1차 기준
return a[0] - b[0]; // 2차 기준
});
Comparator 정렬 규칙
Comparator의 반환값은 부호로 순서가 결정된다.
- 음수 : a가 앞
- 0 : 같음
- 양수 : b가 앞
// 오름차순 정렬
(a, b) -> a[0] - b[0] // 작은 값이 앞으로, 큰 값이 뒤로
// 내림차순 정렬
(a, b) -> b[0] - a[0] // 큰 값이 앞으로, 작은 값이 뒤로
Comparator
나 String.compareTo
모두 내부적으로 유니코드 값을 기준으로 비교해서 음수·0·양수로 결과를 주고, 그 부호를 그대로 쓰면 오름차순, 부호를 뒤집으면 내림차순 정렬이 되는 것이다.
compareTo 메서드
자바에서 문자열이나 숫자 객체(String, Integer 등)를 사전순 정렬 기준으로 비교해주는 메서드
- 음수 : a가 앞
- 0 : 같음
- 양수 : b가 앞
String a = "Banana";
String b = "Apple";
System.out.println(a.compareTo(b)); // 1 (양수)
Comparator 규칙에 따라 Apple 이 앞, Banana 뒤로 정렬됨
백준 정렬 문제
10814번 - 나이순 정렬
나이를 기준으로 오름차순 정렬
Arrays.sort(arr, (a, b) -> Integer.parseInt(a[0]) - Integer.parseInt(b[0]));
11650번 - 좌표 정렬하기
x좌표가 같으면 y좌표 오름차순 정렬
Arrays.sort(arr, (a, b)->{
if(a[0] == b[0]) return a[1] - b[1];
return a[0] - b[0];
});
1181번 - 단어 정렬
- 길이가 짧은 것부터 (오름차순)
- 길이가 같으면 사전 순으로
- 중복된 단어는 하나만 남기고 제거 -> set 사용
- set을 사용하므로 list로 변환 후 정렬해야함
List<String > list = new ArrayList<>(set);
Collections.sort(list, (a, b)->{
if(a.length() == b.length()) return a.compareTo(b); // 사전순
return a.length() - b.length(); // 길이 짧은 순
});
26265번 - 멘토와 멘티
- 멘토 같으면 멘티 사전 역순 정렬
- 아니면 멘토 사전순 정렬
Arrays.sort(arr, (a, b) -> {
// 멘토 같으면 멘티 사전 역순 정렬
if (a[0].equals(b[0])) return b[1].compareTo(a[1]);
// 아니면 멘토 사전순 정렬
return a[0].compareTo(b[0]);
});
23056번 - 참가자 명단
studentComparator
만들어 복합 정렬 구현
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
List<Student> students = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 학급수
int m = Integer.parseInt(st.nextToken()); // 신청 가능 인원수
int [] arr = new int[n+1];
while(true){
st = new StringTokenizer(br.readLine());
int grade = Integer.parseInt(st.nextToken());
String name = st.nextToken();
if(grade == 0) break;
if (arr[grade] < m) {
students.add(new Student(grade, name));
arr[grade]++;
}
}
Collections.sort(students, (a, b) -> {
// 1. 청팀(1, 홀수)가 백팀(0, 짝수) 보다 먼저오도록 정렬 -> 내림차순 정렬
int team1 = a.grade % 2;
int team2 = b.grade % 2;
if (team1 != team2) return team2 - team1;
// 2. 학급 오름차순
if (a.grade != b.grade) return a.grade - b.grade;
// 3. 길이 같으면 사전순, 다르면 짧은것부터
if (a.name.length() == b.name.length()) return a.name.compareTo(b.name);
else return a.name.length() - b.name.length();
});
for (Student student : students) {
System.out.println(student.grade + " " + student.name);
}
}
static class Student{
int grade;
String name;
Student(int grade, String name){
this.grade = grade;
this.name = name;
}
}
}
댓글남기기