article thumbnail image
Published 2022. 6. 4. 03:35
등수구하기
N(1<=N<=100)명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 줄에 N(3<=N<=1000)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력
된다. 같은 점수가 입력될 경우 높은 등수로 동일 처리한다. 즉 가장 높은 점수가 92점인데
92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.
▣ 출력설명
입력된 순서대로 등수를 출력한다.
▣ 입력예제 1
5
87 89 92 100 76
▣ 출력예제 1
4 3 2 1 5
 

위 코드는 주어진 배열 arr에서 각 요소가 몇 번째로 작은 요소인지를 찾아서,

그 결과를 배열 result에 저장하는 문제이다.

 

📌작성코드

<html>

<head>
  <meta charset="UTF-8">
  <title>출력결과</title>
</head>

<body>
  <script>
    function solution(arr) {
      let answer = [];
      let count = 1; //기본 값은 1등이여야하니까 1로 초기값 세팅
      for (let i = 0; i < arr.length; i++) { //87점기준으로 한명씩 돌면서 for문에 넣어줌
        count = 1; //사람이 바뀔때마다 카운터 다시 세팅
        for (let j = 0; j < arr.length; j++) { //나를 제외한 모든 사람과 비교
          if (arr[i] < arr[j]) { //조건문에 부합하면 실행 
            count = count + 1 //j+1
          } else if (!(arr[i] < arr[j])) { 
            answer[i] = count
          }
        }
      }
      return answer;
    }
    let arr = [87, 89, 92, 100, 76];
    console.log(solution(arr));
  </script>
</body>

</html>
 
 
문제에서원하는 건, 87과 89/ 87,92/ 87,100/ 87,76....으로 순차적으로 비교하는 것으로 
이중for문을 사용해서 만들어주었다. 
 
두번째 for문에서 j=0인 이유는, 처음에는 단순하게 87,89/87,92...이렇게 비교해야하기 때문에 
j=0부터 시작하면 불필요한 리소스라고 생각하고, j=1로 세팅했다.
 
하지만 다시 한번 생각해보니, 우리가 비교해주는 값들은 각각의 숫자에 대한 count 값이기때문에
87부터 순차적으로 모든 배열을 다 돌고나면, 다시 89부터 순차적으로 모든 배열을 비교해줘야한다는 점을 알았다.
j=1이면 맨 앞에있는 87은 비교가 되지않기때문에 당연히 다른 결과값을 반환하게 된다.
 
 
!arr[i] < arr[j]라는 조건은 (arr[i] < arr[j])를 부정한 것으로 해석된다.
하지만, 부정 연산자인 !는 < 연산자보다 우선순위가 높기 때문에, arr[i]가 0 또는 falsy한 값인 경우,
부정 연산자가 먼저 적용되어 true가 되고, 이후에 < 연산자가 적용되어 잘못된 결과가 반환된다.

따라서, else if 부분의 조건은 !(arr[i] < arr[j])와 같이, 부등호와 부정 연산자를 모두 괄호로 묶어줘야한다.

!arr[i] < arr[j] 는 결과적으로 arr[i] >= arr[j] 와 같은 의미이다.

위 코드의 문제점  result 배열이 초기화되지 않았기 때문에 result 배열에 값을 할당하기 전까지는 undefined 값이 할당되어 출력 결과가 원하는 것과 다르게 나타난다.

 

예를 들어, arr=[1,100,87] 이있고, i가 0이고, j가 0일 때 조건문에서 count는 1로 초기화됩니다.

이후, j가 1일 때, arr[i] < arr[j] 조건에 부합하여 count가 2가 됩니다.

그러나, j가 2일 때, arr[i] < arr[j] 조건에 부합하지 않으므로, result[0]에 count 값인 2가 할당되어야 합니다. 하지만, result[0]은 초기화되어 있지 않기 때문에, undefined가 할당되어 결과값이 [1, 1, 2]와 같이 나타나게 됩니다.

따라서, result 배열을 for문 내에서 초기화해주어야 합니다.

 

 

 

 

2차 풀이(23.04.05) 📍

  function solution(arr) {
    let result = [];

    for (let i = 0; i < arr.length; i++) {
      let count = 1;

      for (let j = 0; j < arr.length; j++) {
        if (arr[i] < arr[j]) {
          count++;
        }
      }
      result[i] = count;
    }

    return result;
  }

  let arr = [1, 100, 76];
  console.log(solution(arr)); // [3, 1, 2]

위에서 풀었던 문제에서 else if (!(arr[i] < arr[j])) 조건을 사용하게 되니, 

오류가 발생하는 것 같아 수정하였다.

'알고리즘' 카테고리의 다른 글

[알고리즘 문제] 3-1번  (0) 2022.06.08
[알고리즘 문제] 2-6번  (0) 2022.06.07
[알고리즘 문제] 2-4번  (0) 2022.06.02
[알고리즘 문제] 2-3번  (0) 2022.06.02
[알고리즘 문제] 2-2번  (0) 2022.06.02
복사했습니다!