2021/12/29) 5. 등수구하기 [1,2차원 탐색]

1. 문제

<등수구하기>
: N명의학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성한다. 같은 점수가 입력될 경우 높은 등수로 동일 처리한다. 즉, 가장 높은 점수가 92점인데 92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.

2. 해결 방법

  1. Array.from해서 배열을 초기화 해준다.
  2. 두 개의 for문을 돌리는데, 만약 i인덱스의 값보다 j인덱스의 값이 더 크면, 1씩 더해준다.
    ex > arr[1] < arr[1]일 경우일 땐, 값이 같으므로 1이 더해지지 않고 패스됨.
    만약 [92,92,73,92,100]일 때, arr[2]:73을 기준으로 안에 있는 for문을 돌리면, 92일 때 1누적 또 92일 때 1누적 73일 때 패스 92일 때 1누적 100일 때 1누적해서 결과적으로 5가 된다.

! 플러스 개념
-> Array.from : 배열 초기화!

  • 첫 번째 파라미터로는 배열 길이를 주고, 두 번째 파라미터로는 화살표함수를 사용해 배열의 값을 준다!
    ex > Array.from({length:7},()=>3)
    혹은 이런 식으로도 가능함.
    Array.from([1, 2, 3],(v, i) => i);

3. 정답

        <script>
            function solution(arr){  
                let n=arr.length;
                let answer=Array.from({length:n}, ()=>1);
                for(let i=0; i<n; i++){
                    for(let j=0; j<n; j++){
                        if(arr[j]>arr[i]) answer[i]++;
                    }
                }             
                return answer;
            }
            let arr=[87, 89, 92, 100, 76];
            console.log(solution(arr));
        </script>

4. 내 코드와 비교 그리고 반성

나는 배열 초기화를 하지 않았고, cnt변수를 생성하여 최종 cnt값을 배열에 push하였다. 그리고 어차피 같은 배열 인덱스(ex > arr[1]:i와 arr[1]:j)끼리는 값이 같으니, 조건을 arr[j] > arr[i]로 주면, 패스될 수밖에 없는데, 쓸데없이 ===조건까지 넣었다. 그리고 cnt값을 1로 초기화하면 됐는데 굳이 0으로 초기화해서 코드를 더 난잡하게 만들었다. 제일 반성해야 할 점은 오답을 출력.. 근데 아직도 어디가 틀린건질 모르겠다.

        <script>
            function solution(arr){  
                let answer = [], cnt = 0;
                for(let i = 0; i < arr.length; i ++){
                    for(let j = 0; j < arr.length; j ++){
                        if(arr[i] < arr[j] ) cnt++;
                    }
                    arr[i] = 1 + cnt;
                    cnt = 0;
                    answer.push(arr[i]);
                }
                return answer;
            }
            let arr=[87, 89, 92, 100, 76];
            console.log(solution(arr));
        </script>

ㅂㄷㅂㄷ

좋은 웹페이지 즐겨찾기