본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 선택 정렬

by spare8433 2024. 1. 8.

문제 : 선택 정렬



문제 설명


N개이 숫자가 입력되면 오름차순으로 정렬하여 출력하는 프로그램을 작성하세요.
정렬하는 방법은 선택정렬입니다.


▣ 입력설명

첫 번째 줄에 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 자연수가 공백을 사이에 두고 입력됩니다. 각 자연수는 정수형 범위 안에 있습니다.


▣ 출력설명

오름차순으로 정렬된 수열을 출력합니다.


▣ 입력예제 1

6
13 5 11 7 23 15


▣ 출력예제 1

5 7 11 13 15 23



내코드


// 선택 정렬: 순서에 맞는 요소를 선택하여 위치에 맞게 정렬하는 방식
function solution(arr) {
  let answer = arr;

  // 문자열 길이 만큼 순회
  for (let i = 0; i < answer.length; i++) {
    // i 번째 숫자 임시 변수 tempIdx 에 저장
    let tempIdx = i;

    // i 번째 이후 숫자들을 순회하면서 tempIdx 번째 숫자보다 작은 숫자일 경우 그 인덱스를 tempIdx 저장
    // 최종적으로 tempIdx에 가장 작은 값을 가진 인덱스를 저장
    for (let j = i + 1; j < answer.length; j++) {
      if (answer[tempIdx] > answer[j]) tempIdx = j;
    }

    // tempIdx 인덱스 값과 i 번째 값을 서로 바꿈
    let tempValue = answer[tempIdx];
    answer[tempIdx] = answer[i];
    answer[i] = tempValue;
  }

  return answer;
}

let arr = [13, 5, 11, 7, 23, 15];
console.log(solution(arr));



풀이


  1. 문자열 길이 만큼 순회하면서 i 번째 숫자 임시 변수 tempIdx 에 저장
  2. 새로 i + 1 번째 숫자들을 순회하면서 tempIdx 번째 숫자보다 작은 숫자일 경우 그 인덱스를 tempIdx 저장하고 최종적으로 tempIdx에 가장 작은 값을 가진 인덱스를 저장
  3. tempIdx 인덱스 값과 i 번째 값을 서로 바꿔 결국 최소값 순서대로 정렬됨



보완할 수 있는 부분



// 기존코드
let tempValue = answer[tempIdx];
answer[tempIdx] = answer[i];
answer[i] = tempValue;

// 보완코드
// 좌측 [arr[i], arr[tempIdx]] 부분은 각 배열의 주소를 나타내며 우측의 [arr[tempIdx], arr[i]] 배열의 값을 의미한다
// 우측의 배열을 좌측에 배열에 구조분해 할당 하여 집어넣는 형태의 코드
[arr[i], arr[tempIdx]] = [arr[tempIdx], arr[i]];

따로 임시로 변경할 값을 저장하는 변수를 통해 값을 교환하는 방식에서 배열의 주소와 값을 활용하는 방식으로 구조분해 할당 방식으로 값을 변경




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard