백준 11497 통나무 건너뛰기 자바

꾸준하게 달리기~·2023년 6월 22일
0
post-thumbnail

문제 링크는 다음과 같다
https://www.acmicpc.net/problem/11497

풀이는 다음과 같다

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());

        while(T-- > 0) {
            int N = Integer.parseInt(br.readLine());
            int[] tree = new int[N]; //나무 주어진대로 넣기
            int[] answer = new int[N]; //나무 높이 차 최솟값으로 넣기
            StringTokenizer st = new StringTokenizer(br.readLine());

            for(int i = 0 ; i < N ; i++) {
                tree[i] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(tree); //정렬된 tree를 처음 index부터 차례대로 왼쪽, 오른쪽으로 넣기 = 인접한 통나무의 높이 차가 최소가 된다.

            //왼쪽 오른쪽으로 차례대로 넣는 로직은 N이 짝수일때와 홀수일 때를 따로 만들었다.
            if(N % 2 ==0) { //N이 짝수일때,
                int i = 0;
                int left = 0;
                int right = N-1;
                while(left+1 <= right) {
                    answer[left] = tree[i];
                    answer[right] = tree[i+1];
                    i+=2;
                    left++;
                    right--;
                }
            }
            else { //N이 홀수일때
                int i = 0;
                int left = 0;
                int right = N-1;
                while(left != right) {
                    answer[left] = tree[i];
                    answer[right] = tree[i+1];
                    i+=2;
                    left++;
                    right--;
                }
                answer[N/2] = tree[N-1];
            }
            //여까지오면 answer엔 높이 차 최솟값으로 넣어놨음.

            int max = Math.abs(answer[N-1] - answer[0]);

            for(int j = 0 ; j < N-1 ; j++) {
                if(max < Math.abs(answer[j] - answer[j+1])) max = Math.abs(answer[j] - answer[j+1]);
            }

            bw.write(String.valueOf(max) + "\n");

        }

        bw.flush();
        bw.close();
    }

}

이 문제에서 이해해야 할 내용.
정렬된 친구들
12345678 이 있다고 하자.
index 0부터 순서대로 다른 배열의 왼쪽, 오른쪽 이렇게 끝까지 넣게 되면,
(12)
(1342)
(135642)
(13578642)
이렇게 만들어진 배열이, 인접한 두 수를(처음과 끝 포함) 비교했을때
최솟값이 나오게 하는 배열이다 (그리디.)


해당 로직까지는 혼자 잘 생각했는데, left와 right 사용을 생각을 못하고 for문에서 2i로 난리부르서 야단법석을 떨다가 시간을 잡아먹었다.

배울점 : 왼쪽오른쪽 한꺼번에 사용할 일 있으면 앞으로 left, rigth 사용하자.

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글