본문 바로가기
TIL

[코테연습] 1509. Minimum Difference Between Largest and Smallest Value in Three Moves

by 크라00 2024. 7. 3.


- 배열문제

 

https://leetcode.com/problems/minimum-difference-between-largest-and-smallest-value-in-three-moves/description/?envType=daily-question&envId=2024-07-03

- 문제분석

1. int[] nums 배열 중, 3개 element 를 교체할 수 있다.
2. 그 결과 배열의 최대값 - 최소값 이 가장 적은 수를 리턴해라.

- 문제풀이

1. int[] nums 배열을 오름차순으로 정렬한다.
 1-1. Arrays.sort() 함수 사용
2. 이때, 3개 element 미교체시 가장 작은 수는 0번째 인덱스이며, 가장 큰 수는 nums.length-1 인덱스이다.
3. 3개 element 를 교체할 경우 가장 최적의 해를 구한다.
 3-1. nums.length-1 값이 가장 큰 수이므로 nums.length-3 부터 nums.length-1 까지 교체한다.
 3-2. 이때 가장 작은수는 nums[0], nums[nums.length-4] 이다.
 3-3. 최대 경우의 수는 nums[3] 부터 nums[nums.length-1] 까지이다.
4. 해당 경우의 수를 수식으로 정리한다.
    //0 vs nums.length-4
    //1 vs nums.length-3
    //2 vs nums.length-2
    //3 vs nums.length-1
 4-1. i 가 1 늘어 날때마다 nums.length-(4-i) 만큼 감소한다.
 4-2. 이때 가장 작은 수를 Math.min 함수로 리턴한다.
 

 

class Solution {
    public int minDifference(int[] nums) {
        if (nums.length <= 4) {
            return 0;
        }
        Arrays.sort(nums);
        int min = nums[nums.length-1] - nums[0];
        for(int i = 0; i < 4; i++) {
            int front = nums[i];
            int back = nums[nums.length-(4-i)];

            min = Math.min(min, Math.abs(front-back));
        }

        return min;
    }
}