체크 포인트
1. 키순 정렬
// 키가 큰순으로 내림차순 정렬
Arrays.sort(arr, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
if(o1[0]-o2[0]>0){
return -1;
}
else{
return 1;
}
}
});
-키가 큰 순(내림차순)으로 씨름 선수 지원자 명단을 정렬한다.
-어떤 지원자가 씨름 선수가 되기 위해서는, 다른 지원자와 비교해 키와 몸무게가 모두 낮으면 안 된다.
-따라서 키가 큰 순으로 지원자 명단을 정렬한 후 제일 첫번째 지원자를 카운트+1해준다.
-왜냐하면 키가 제일 큰 지원자는 무조건 합격이기 때문이다.
2. 키순 정렬 후, 몸무게를 기준으로 비교
// 초기 최대 몸무게 변수
int maxWeight = arr[0][1];
-키가 제일 큰 지원자의 몸무게를 초기 최대 몸무게로 설정한다.
-다른 지원자가 씨름 선수 명단에 뽑히기 위해서는 maxWeight보다 몸무게가 높아야 한다.
-'씨름 선수로 뽑힐 수 있는 최대 인원'을 구하기 위해, 키 순으로 몸무게를 비교해 탐색한다.
//예시 1
//지원자 정렬 전 키/몸무게
172 67
183 65
180 70
170 72
181 60
//키 내림차순 정렬 후 키/몸무게
183 65
181 60
180 70
172 67
170 72
-예시1)을 토대로 자세히 설명하자면,
1)1번 지원자는 키 183 몸무게 65이고, 키가 제일 크므로 선수 명단에 등록된다.(maxWeight = 65)
2)2번 지원자는 키 181 몸무게 60이고, maxWeight(65)보다 몸무게가 낮으므로 선수에서 제외된다.
3)3번 지원자는 키 180 몸무게 70이고, maxWeight(65)보다 몸무게가 높으므로 선수 명단에 등록된다.(maxWeight = 70)
4)4번 지원자는 키 172 몸무게 67이고, maxWeight(70)보다 몸무게가 낮으므로 선수에서 제외된다.
5)5번 지원자는 키 170 몸무게 72이고, maxWeight(70)보다 몸무게가 높으므로 선수 명단에 등록된다.(maxWeight = 72)
-위 추론과정을 통해 예시 1에서 최대 선수 명단은 3명임을 알 수 있다. 이 과정을 수식화 하면 아래와 같다.
// 첫번째 씨름 선수는 무조건 카운팅 추가(키가 제일 크기 때문)
count++;
// 초기 최대 몸무게 변수
int maxWeight = arr[0][1];
// 2번째 씨름 선수부터 이전 선수와 몸무게 비교
for(int i=1; i<N; i++){
// 이전 선수의 몸무게보다 현재 선수의 몸무게가 크다면,
if(arr[i][1]>maxWeight){
// 씨름 선수 명단 +1
count++;
// 최대 몸무게 갱신
maxWeight = arr[i][1];
}
}
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Main{
static int count;
static Integer[][] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 씨름 선수의 수 N
int N = Integer.parseInt(st.nextToken());
arr = new Integer[N][2];
// 씨름 선수 키/몸무게 명단 입력
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
// 키가 큰순으로 내림차순 정렬
Arrays.sort(arr, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
if(o1[0]-o2[0]>0){
return -1;
}
else{
return 1;
}
}
});
solution(N);
}// end of main
static void solution(int N) {
// 첫번째 씨름 선수는 무조건 카운팅 추가(키가 제일 크기 때문)
count++;
// 초기 최대 몸무게 변수
int maxWeight = arr[0][1];
// 2번째 씨름 선수부터 이전 선수와 몸무게 비교
for(int i=1; i<N; i++){
// 이전 선수의 몸무게보다 현재 선수의 몸무게가 크다면,
if(arr[i][1]>maxWeight){
// 씨름 선수 명단 +1
count++;
// 최대 몸무게 갱신
maxWeight = arr[i][1];
}
}
System.out.println(count);
}
} // end of Main
'코딩테스트' 카테고리의 다른 글
[인프런 자바/java] 3. 결혼식 _디버깅의 눈물 (0) | 2022.10.25 |
---|---|
[인프런 자바/java] 2. 회의실 배정 _디버깅의 눈물 (0) | 2022.10.24 |
[백준-2217번 자바/java] 로프 _디버깅의 눈물 (0) | 2022.10.24 |
[백준-1541번 자바/java] 잃어버린 괄호 _디버깅의 눈물 (0) | 2022.10.24 |
[백준-5585번 자바/java] 거스름돈 _디버깅의 눈물 (0) | 2022.10.21 |