[Algorithm]Toy Problem 13

안정태·2021년 5월 8일
0

Algorithm

목록 보기
13/50
post-thumbnail

문제 : insertionSort

배열을 입력받아 오름차순으로 정렬하여 리턴하는 함수

let output = insertionSort([3, 1, 21]);
console.log(output); // --> [1, 3, 21]

문제의 접근

문제를 해결하기 위해서는 먼저 삽입정렬을 알아야 한다. 구글링을 해본 결과 삽입정렬은 다음과 같다.

자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입하는 정렬

다음 내용을 코드로 구현하면 다음과 같다.

const insertionSort = function (arr) {
  // TODO: 여기에 코드를 작성합니다.

  for(let i = 1; i < arr.length; i++){ //모든 배열의 두번째 숫자부터 끝까지 실시
    let num = arr[i]; // 위치를 찾아 넣을 대상 숫자를 선정
    let index = i - 1; // 대상이 있는 위치의 앞의 위치를 선정

    while( index >= 0 && arr[index] > num){ //대상이 대상의 앞 숫자보다 작으면 실시
      arr[index+1] = arr[index]; //다음 위치에 대상의 앞 숫자를 삽입
      index--; //인덱스를 한칸 앞으로 당긴다.
    }

    arr[index + 1] = num; //대상이 대상의 앞 숫자랑 같거나 크면 대상의 다음에 숫자를 넣어준다.
  }
  return arr;
};

Advanced

함수의 두 번째 인자로 callback 함수를 받아서, 그 함수의 리턴값을 기준으로 요소들을 정렬한다.

이제 정렬 방식은 완성되었다. 이제 여기에 콜백 함수를 받아서 받은 값끼리 비교를해서 정렬해 주면 된다.

const insertionSort = function (arr, callback = (num) => num) {
  // TODO: 여기에 코드를 작성합니다.

  for(let i = 1; i < arr.length; i++){
    let num = arr[i];
    let index = i - 1;

    while(index >= 0 && callback(arr[index]) > callback(num)){
      arr[index+1] = arr[index];
      index--;
    }

    arr[index + 1] = num;
  }
  return arr;
};

먼저 비교 시에 callback 함수를 적용해서 적용값만 비교해주면 모든 일은 일사천리로 진행된다. 한가지 조심해야할 점은 callback 함수의 값이 없을 때를 대비해서 반드시 기본값 매개변수 형식으로 기본 함수를 정의해 줘야 한다.

문제를 통해 생각해 볼 것

개념은 이해했지만 솔직히 이해한 내용을 코드로 구현하는데 어려움이 있어 다른 언어로 작성된 코드를 참고했다. 아직 조금 부족한 감이 없지 않다. 그래도 콜백을 적용하는데 있어서는 혼자 힘으로 생각하고 오류를 보고 문제를 파악해서 풀어낼 수 있었다.

profile
코딩하는 펭귄

0개의 댓글