LeetCode Weekly Contest Question#1 Review 📓
You are given an array nums
of non-negative integers. nums
is considered special if there exists a number x
such that there are exactly x
numbers in nums
that are greater than or equal to x
.
Notice that x
does not have to be an element in nums
.
Return x
if the array is special, otherwise, return -1
. It can be proven that if nums
is special, the value for x
is unique.
//(special number)x가 무엇인지 찾는 문제. x는 x보다 같거나 큰 nums 요소의 '갯수'이면서 요소들을 검사하는 '기준'이 된다.
//x <= nums.length;
//nums.length 부터 시작해서 count-down하며 'x보다 같거나 큰 요소들의 갯수'를 변수에 담는다.
var specialArray = function(nums) {
//조건을 충족하는 요소들을 count 할 변수 선언
//x는 배열의 길이부터 시작해서 카운트다운. passedEl은 조건이 충족될 때마다 1씩 증가.
var x = nums.length;
while (x > 0){
//x의 값이 줄어들 때마다 카운트는 초기화가 되어야 한다!!! 위치주의!!
var passedEl = 0;
for (var i = 0; i <= nums.length; i++){
if (nums[i] >= x){
passedEl++;
}
}
//조건을 충족하면 리턴값 반환. x가 줄어드는 순간과 리턴값이 반환되어야 하는 시점을 생각할 것!!! 위치주의!!!
if (x === passedEl){
return passedEl;
}
x--;
//x가 0으로 줄어들때까지 조건을 충족하지 못하면, -1리턴. x--;이후에 x가 0이 되기 때문에 while문 내부에 위치해야함.
if(x === 0) {
return -1
}
}
}
if (nums[i] >= x)
조건을 충족하는 요소의 갯수를 세는 var passedEl = 0;
가 선언되어야 하는 위치는 for문의 외부이면서 while문의 내부여야한다. 왜냐하면,x
의 값이 줄어들 때마다 passsedEl
카운트는 초기화가 되어야하기 때문이다. x--;
를 if (x === passedEl)
문 이전에 기재함으로 인해 x
와 passedEl
의 값이 일치하지 않음에도 불구하고 if문이 실행되는 오류가 생겼다. (ex. passedEl
이 3일 때x
가 4 -> 3으로 먼저 줄어들면 직후에 따라오는 조건if (x === passedEl)
을 충족하게 된다.) 따라서 x--;
위치를 if 문 이후로 옮겨 해당 loop의 결과를 먼저 검사한 이후에 x
의 값을 변경할 수 있도록 정정했다. -1
을 반환하는 로직 if(x === 0)
은 while (x > 0)
문 내부 혹은 외부에 모두 위치할 수 있지만, 반드시x--;
이후에 위치해야한다. 그래야만 x
가0
로 변경되었을 때(즉, 모든 경우의 수를 검사하고 나서도 조건을 충족하는 special 값이 없을 때) 리턴값 -1
을 반환할 수 있다. 여기서 기억해야 할 점은,if(x === passedEl)
내부의 return값은 return을 만나면 단지 if문만 벗어나는 것이 아니라, 이후에 따라오는 코드들은 무시한 채 specialArray
에 값을 반환한다. 따라서 if(x === 0)
이 실행되지 않으려면 앞전에서 return을 만나지 않아야 한다.