inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바스크립트로 배우는 자료구조 & 알고리즘 (개념+문제풀이)

선택정렬 이해하기 & 구현하기

강의에 나온 selection 코드에 오류가 있습니다.

해결된 질문

121

정재웅

작성한 질문수 6

0

강의 코드

function selectionSort(array) {
  const n = array.length - 1;

  for (let i = 0; i < n; i++) {
    let minIndex = i;

    for (let j = i + 1; j < n; j++) {
      if (array[j] < array[minIndex]) {
        minIndex = j;
      }
    }

    if (minIndex !== i) {
      const temp = array[i];
      array[i] = array[minIndex];
      array[minIndex] = temp;
    }
  }

  return array;
}

// console.log(selectionSort([77, 41, 6, 4, 3, 2, 5, 222]));
console.log(selectionSort([3, 6, 5, 2, 8, 1]));

[문제]
위 방식처럼 하면 n이 array.length - 1 이기때문에 두번째 for문은 j가 마지막 인덱스 이전까지만 수행된다. 즉 마지막 인덱스 요소는 정렬 X

[3,6,5,2,8,1]를 예시로 들자면,
i가 0일때 j는 1번째 인덱스부터 시작하며 j가 n보다 작을때까지 최소값을 탐색한다.
j가 5일때 j < n 조건에 맞지 않아 minIndex를 1로 바꾸는거 실행 X

[해결]
따라서 n을 array.length - 1로 할당하지 않고 array.length로 해야함
그러면 두번째 for문에서 j의 조건에 맞아 마지막 인덱스 접근 가능
추가로 i는 마지막 인덱스에 접근할 필요가 없으므로 첫 번째 for문의 조건을 n - 1로 바꾸기.


function selectionSort(array) {
  const n = array.length;

  for (let i = 0; i < n - 1; i++) {
    let minIndex = i;

    for (let j = i + 1; j < n; j++) {
      if (array[j] < array[minIndex]) {
        minIndex = j;
      }
    }

    if (minIndex !== i) {
      const temp = array[i];
      array[i] = array[minIndex];
      array[minIndex] = temp;
    }
  }

  return array;
}

// console.log(selectionSort([77, 41, 6, 4, 3, 2, 5, 222]));
console.log(selectionSort([3, 6, 5, 2, 8, 1]));

javascript 코딩-테스트 알고리즘 data-structure

답변 2

0

Kyo

맞습니다! 마지막원소가 가장 큰값이 아닐경우 정렬되지 않으므로, 말씀해주신부분처럼 n을 수정해야겠네요!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 정재웅님.

질문해주신 selectionSort 코드 오류와 그에 따른 수정 사항을 명확하게 설명해주셔서 감사합니다. 말씀하신 것처럼, 원래의 selectionSort 코드에서 narray.length - 1로 설정하면 마지막 요소를 비교하지 못하는 문제가 발생할 수 있습니다.

원래 문제점
- for (let j = i + 1; j < n; j++) 로 인해 마지막 인덱스를 비교하지 않게 되는 오류가 있었습니다.

해결 방법
- narray.length로 설정하여 모든 요소가 제대로 비교되도록 하고, for 루프의 조건에서 n - 1로 설정하여 마지막 요소 전까지 비교하도록 변경하였습니다.

이러한 변경사항은 정렬 알고리즘에서 한 번 더 전체 배열 길이를 순회하지 않고도 모든 요소가 정렬될 수 있도록 최적화하는데 도움을 줍니다.

추가적으로, 이는 알고리즘의 시간이 매우 절약되도록 설정한 것으로, 특히 큰 배열에서는 효율에 큰 차이를 느낄 수 있습니다.

관련된 더 많은 설명은 아래 유사한 질문들에서 찾아보시면 도움이 될 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

GROUP BY, HAVING 실습 1번문제

1

9

2

4 - A

0

11

1

코딩 테스트 All-in-One(Java)' 강의 노션 교재 권한문의

0

16

1

state 객체로 묶기

0

15

0

태어난김에 세계일주 시간 초과

0

16

1

2강에 파일 어디있을까여,,

0

18

2

커리큘럼 중 정렬 관련 질문

0

15

1

코딩살구클럽 입장이 안됩니다

0

52

2

코테 사이트 로그인 불가

0

22

1

마인드맵 사용 프로그램

0

19

1

엔터티 종류

0

21

2

4-F 경우의 수 질문입니다.

0

30

2

코딩살구클럽 가입이 안됩니다.

0

64

2

실습 권한이 없네요··· 이건 ··· 좀··· 401 에러떠요

0

29

3

생산 공정 최적화 (이분탐색) worst Case 수정

0

52

1

버블정렬

0

46

1

학습 방향성에 대한 문의

1

75

2

큐 구현 관련

0

55

2

난이도 질문

0

92

2

강의 구현 코드

0

92

2

테스트 케이스 관련

0

71

1

연결리스트 뒤집기

0

73

2

공부방법 문의

0

76

1

알고리즘 개념에 대한 추천 자료문의

0

69

1