[algorithm] 등수구하기

Ho-eng·2023년 4월 17일
0

❓ 등수구하기


N(1<=N<=100)명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는
프로그램을 작성하세요.

  • 입력설명

    첫 줄에 N(3<=N<=1000)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력된다.
    같은 점수가 입력될 경우 높은 등수로 동일 처리한다.
    즉, 가장 높은 점수가 92점인데 92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.
  • 출력설명

    입력된 순서대로 등수를 출력한다.
  • 입력예제 1

    87 89 92 100 76
  • 출력예제 1

    4 3 2 1 5

❗ 문제 풀이

내 풀이

<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(arr) {
        //내림차순으로 정렬 후,
        //내림차순의 인덱스(순위)가 원래 배열의 몇번째에 위치하는지를 리턴하면 됨

        const sort = arr.slice().sort((a, b) => b - a)
        // console.log(sort)

        const result = arr.map((element) => sort.indexOf(element) + 1) // 순위 매기기

        // debugger

        return result
      }

      let arr = [87, 89, 92, 100, 76]
      console.log(solution(arr))
    </script>
  </body>
</html>
  • 컨셉
    : 2개의 배열을 비교할 건데, 하나는 큰 순서대로 정렬한 배열(b)과 원래 배열(a)이다.
    두 배열을 비교해서 a === b일때, b의 몇번째 인덱스에 존재하는가를 리턴하면 끗.

  • 코드리뷰
    a. 복사본을 만들기 위해 slice()를 사용하고, 내림차순으로 정렬을함
    b. map()을 사용하여, indexOf()를 통해, 원래배열(a)와 정렬한 배열(b)의 같은 숫자의 위치를 찾아낸다.
    (indexOf()는 참 일때, -1을 리턴하니 +1을 해준다.)

정답 소스

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <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>
    </body>
</html>
profile
매일 '어제의 나와 오늘의 나는 무엇이 다를까?'를 고민하는 김호엥입니다.

0개의 댓글