ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 11497번] 통나무 건너뛰기(자바)
    Algorithm/Greedy Algorithm 2022. 3. 17. 20:08

    백준알고리즘 11497번 : 통나무 건너뛰기

     

     

     

    두 통나무 간의 최대 높이의 차를 최소한으로 줄여야하는 문제이다.
    다만 통나무가 원형으로 이어져있으므로 단순 정렬만으로는 N[0] 과 N[N.length-1] 간의 차이가 극대화되므로 오답이 발생한다.

    나는 통나무간의 간격을 줄이기 위해서는
    최저점 N[0]과 최고점 N[N.length-1] 간의 지점들을 두 부류로 나누어서 찾아야한다고 생각했다.
    즉 최저점과 최고점을 연결하는 선이 두개가 되도록 해야, 최대 높이의 차를 줄일수 있다고 판단하였다.
    따라서 N[0], N[2], N[4] ... N[N.length-1] 간의 비교와
    N[0], N[1], N[3] ... N[N.length-1] 간의 비교를 동시에 해주도록하였다.

     

     

     

    풀이 과정


    1. 통나무 목록을 오름차순으로 정렬한다.
    2. 홀수번째의 통나무간의 최대 높이 차를 계산하고, 짝수번쨰의 통나무간의 최대 높이 차를 
       계산하여 가장 큰 높이가 정답이 되도록 한다.
    3. 이 때 홀수번째 통나무든 짝수번째 통나무든 0번째 통나무, 그리고 N.length-1(가장 긴)번째
       통나무와의 비교는 항상 있어야한다. 즉, 홀수번째끼리 비교도 필요하지만
       (3번째와 1번째, 5번째와 3번째..) 1번째와 0번째의 비교도 필수적이며 7번째와 8번째의 비교도
       필요하다는 의미이다.
        이를 유념하여 비교해주어, 추출된 최댓값을 출력한다.

     

     

    ▽ 정답 소스 보기

    더보기
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {// No11497 통나무 건너뛰기
    
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int tc = Integer.parseInt(br.readLine());
    
    		for (int i = 0; i < tc; i++) {
    			int nums = Integer.parseInt(br.readLine());
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int[] arr = new int[nums];
    			for (int j = 0; j < nums; j++) {
    				arr[j] = Integer.parseInt(st.nextToken());
    			}
    			Arrays.sort(arr);
    
    			int strt = arr[arr.length - 1] - arr[arr.length - 2] > arr[1] - arr[0]
    					? arr[arr.length - 1] - arr[arr.length - 2]
    					: arr[1] - arr[0];
    			for (int j = 2; j < arr.length; j += 2) {
    				if (arr[j] - arr[j - 2] > strt) {
    					strt = arr[j] - arr[j - 2];
    				}
    			}
    
    			for (int j = 3; j < arr.length; j += 2) {
    				if (arr[j] - arr[j - 2] > strt) {
    					strt = arr[j] - arr[j - 2];
    				}
    			}
    
    			System.out.println(strt);
    
    		}
    	}
    }

     

     

     

    댓글

Designed by Tistory.