본문 바로가기

코딩테스트

[인프런 자바/java] 1. 씨름 선수 _디버깅의 눈물

체크 포인트

 

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