[Algorithm/JavaScript] Special Array With X Elements Greater Than or Equal X

LeetCode Weekly Contest Question#1 Review 📓


문제출처: https://leetcode.com/contest/weekly-contest-209/problems/special-array-with-x-elements-greater-than-or-equal-x/

문제

문제설명

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.

예시

제한사항

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

제출답안

//(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
        }
    }
}

오늘의 Lesson

  • if (nums[i] >= x)조건을 충족하는 요소의 갯수를 세는 var passedEl = 0;가 선언되어야 하는 위치는 for문의 외부이면서 while문의 내부여야한다. 왜냐하면,x의 값이 줄어들 때마다 passsedEl카운트는 초기화가 되어야하기 때문이다.
  • x--;if (x === passedEl)문 이전에 기재함으로 인해 xpassedEl의 값이 일치하지 않음에도 불구하고 if문이 실행되는 오류가 생겼다. (ex. passedEl이 3일 때x가 4 -> 3으로 먼저 줄어들면 직후에 따라오는 조건if (x === passedEl)을 충족하게 된다.) 따라서 x--;위치를 if 문 이후로 옮겨 해당 loop의 결과를 먼저 검사한 이후에 x의 값을 변경할 수 있도록 정정했다.
  • 조건을 충족하는 special 값이 존재하지 않을 경우 -1을 반환하는 로직 if(x === 0) while (x > 0)내부 혹은 외부에 모두 위치할 수 있지만, 반드시x--;이후에 위치해야한다. 그래야만 x0로 변경되었을 때(즉, 모든 경우의 수를 검사하고 나서도 조건을 충족하는 special 값이 없을 때) 리턴값 -1을 반환할 수 있다. 여기서 기억해야 할 점은,
    if(x === passedEl)내부의 return값은 return을 만나면 단지 if문만 벗어나는 것이 아니라, 이후에 따라오는 코드들은 무시한 채 specialArray에 값을 반환한다. 따라서 if(x === 0)이 실행되지 않으려면 앞전에서 return을 만나지 않아야 한다.
  • ❗️반복문에서는 변수선언문의 위치에 따라 결과가 상당히 달라진다. 항상 변수 선언문의 위치에 주의할 것❗️

좋은 웹페이지 즐겨찾기