JS 알고리즘 문제풀이/섹션 7. 정렬과 그리디, 결정알고리즘

1.선택정렬

crab. 2022. 6. 29. 07:27

📌강의 정리

반복문을 두개 돌려서 정렬한다.

처음의 반복에서는 i를 idx라는 이름으로 가져오고 두번째 반복에서는 idx와 j의 값을 비교해 작은 값을 idx의 값으로 지정해준다.

이렇게 반복을 돌리면 idx에는 제일 작은 j값이 들어가 있기에 구조분해할당을 써서 i와 idx의 값을 서로 바꿔준다. (이렇게 해야 원래 i에 있던값도 정렬되었을때의 제자리로 갈 수 있다.)

 

📌느낀점

어렵지는 않은 문제였으나 복잡도를 따지면 도저히 이해가 안되는 알고리즘이라 그 점이 힘들었다.

하지만 강사님의 코드를 보면 구조분해할당을 쓴 점과 코드의 간결함은 배울 점이 상당히 많았다.

 

//나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(arr) {
        let answer = arr;
        let min = 0;
        let tmp = 0;
        let tmpNum = 0;
        for (let i = 0; i < arr.length; i++) {
          min = arr[i];
          for (let j = i + 1; j < arr.length; j++) {
            if (min > arr[j]) {
              min = arr[j];
              tmp = j;
            }
          }
          if (min == arr[i]) continue;
          else {
            tmpNum = arr[i];
            arr[i] = min;
            arr[tmp] = tmpNum;
          }
        }
        return answer;
      }
      //반복을 돌리되 제일 작은 숫자를 찾고
      //그 숫자의 인덱스가 0이면 그대로 아니면 0과 위치를 바꿔준다.
      //끝까지 반복한다.
      let arr = [13, 5, 11, 7, 23, 15];
      console.log(solution(arr));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(arr) {
        let answer = arr;
        for (let i = 0; i < arr.length; i++) {
          let idx = i;
          for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[idx]) idx = j;
          }
          [arr[i], arr[idx]] = [arr[idx], arr[i]];
        }
        return answer;
      }

      let arr = [13, 5, 11, 7, 23, 15];
      console.log(solution(arr));
    </script>
  </body>
</html>