๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/LeetCode

[LeetCode] Non-decreasing Array

๋ฌธ์ œ๋งํฌ

 

Non-decreasing Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์˜ ์ˆซ์ž๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌป๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฒ˜์Œ์—๋Š” ์•ž ๋’ค ์ˆซ์ž๋งŒ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜์˜€์ง€๋งŒ ๊ณง 3๊ฐœ์˜ ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

(2, 3, 4, 8, 3, 4, 5) => nums[i-1] > num[i] ์ธ ๊ตฌ๊ฐ„์ด 1๊ฐœ์ด์ง€๋งŒ ์ •๋‹ต์ผ ์ˆ˜ ์—†์Œ
(1, 2, 50, 3)  => 50์„ ์ค„์ด๊ฑฐ๋‚˜ 3์„ ํ‚ค์›Œ์•ผํ•จ
(1, 2, 1, 3) => 1์„ ํ‚ค์›Œ์•ผํ•จ
(4, 2, 3) => 4๋ฅผ ์ค„์—ฌ์•ผํ•จ..

์ด๋ ‡๊ฒŒ ๋‘ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. (์ €๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค..)

๊ทธ๋ž˜์„œ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

(ํŽธ์˜์ƒ nums[left], nums[mid], nums[right]๋ฅผ left, mid, right๋กœ ํ‘œํ˜„)

1. left <= mid <= right ์ธ ๊ฒฝ์šฐ : continue;
 if(nums[left] <= nums[mid] && nums[mid] <= nums[right]) continue;โ€‹



2. left <= mid <= right๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

2.1 left <= right์ธ ๊ฒฝ์šฐ : left <= right < mid ์ด๋ฏ€๋กœ mid = left ๋Œ€์ž…ํ•˜๊ณ  decreasingCnt++ (์˜ˆ, 1, 5, 3 => 1, 1, 3)
if(nums[left] <= nums[right]){
    nums[mid] = nums[left];
    decreasingCnt++;
}โ€‹

2.2 left > right์ธ ๊ฒฝ์šฐ

2.2.1 left > mid > right ์ธ ๊ฒฝ์šฐ : ์ˆซ์ž๋ฅผ ๋‘๊ฐœ ๋ฐ”๊ฟ”์•ผ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ false (์˜ˆ. 4, 2, 1 => false)
if(nums[left] > nums[mid] && nums[mid] > nums[right]) return false;โ€‹

2.2.2 left > right >= mid ์ธ ๊ฒฝ์šฐ : left์— mid๋ฅผ ๋Œ€์ž…ํ•˜๊ณ  decreasingCnt++  (์˜ˆ, 5, 3, 4 => 3, 3, 4)
else if(nums[mid] <= nums[right]){
    nums[left] = nums[mid];
    decreasingCnt++;
}โ€‹

2.2.3 mid >= left > right์ธ ๊ฒฝ์šฐ : right์— mid๋ฅผ ๋Œ€์ž…ํ•˜๊ณ  decreasingCnt++ (์˜ˆ, 5, 9, 3 => 5, 9, 9)

else if(nums[mid] >= nums[left]){
    nums[right] = nums[mid];
    decreasingCnt++;
}


3. ์ตœ์ข…์ ์œผ๋กœ ๋ฐ”๊พผ ํšŸ์ˆ˜๊ฐ€ 2๋ฒˆ ์ด์ƒ์ด๋ฉด false, 1๋ฒˆ ์ดํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

return decreasingCnt > 1 ? false : true;

 
์ƒ๊ฐ๋ณด๋‹ค ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๋ถ€๋ถ„์ด ๋งŽ์•˜๋˜ ๋ฌธ์ œ์˜€๋‹ค.
for๋ฌธ์„ ํ•œ๋ฒˆ๋งŒ ๋Œ๊ธฐ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„์—์„œ๋Š” ๋‚˜์˜์ง€ ์•Š์•˜๋‹ค. (O(N))

 

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var checkPossibility = function(nums) {
    let decreasingCnt = 0;
    
    for(let i = 0; i < nums.length - 2; i++){
        const left = i, mid = i+1, right = i+2;
        
        if(nums[left] <= nums[mid] && nums[mid] <= nums[right]) continue;
        else{
            // left <= right์ผ๋•Œ mid๋ฅผ ์ž‘์€ ์ชฝ์œผ๋กœ ๋„ฃ๊ณ  decrease++
            if(nums[left] <= nums[right]){
                nums[mid] = nums[left];
                decreasingCnt++;
            }
            // left > right์ผ๋•Œ
            else{
                // left > mid > right
                if(nums[left] > nums[mid] && nums[mid] > nums[right]) return false;
                // left > right >= mid์ผ๋•Œ left = mid, decrease++
                else if(nums[mid] <= nums[right]){
                    nums[left] = nums[mid];
                    decreasingCnt++;
                }
                // mid >= left > right ์ผ๋•Œ, right = mid decrease++
                else if(nums[mid] >= nums[left]){
                    nums[right] = nums[mid];
                    decreasingCnt++;
                }
            }
        }
    }
    
    return decreasingCnt > 1 ? false : true; 
};

'์ฝ”๋”ฉํ…Œ์ŠคํŠธ > LeetCode' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LeetCode] Minimum Deletions To Make Character Frequencies Unique  (0) 2022.06.28
[LeetCode]Maximum Points You Can Obtain From Cards  (0) 2022.06.26
[LeetCode] Valid Parentheses  (0) 2022.06.24
[LeetCode] 3Sum Closest  (0) 2022.06.23
[LeetCode] 3Sum  (0) 2022.06.23