๋ฌธ์ ๋งํฌ
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 |