본문 바로가기
알고리즘/프로그래머스

[프로그래머스]정렬 | K번째 수 JS 풀이

by 질서정연_ 2022. 4. 24.

K번째 수 

 

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42748

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

생각 해 볼만한 점 / 2번째 케이스 체점 오류

문제 자체는 쉽고, 간단하게 풀 수 있다. 

그런데 2번째 케이스에서 체점 오류가 나면서

그냥 정렬 하기 위해 쉽게 생각 없이 써 왔던 sort() 에 대해 생각 해 보게 되었다. 

 

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org

 

MDN 문서에도 나와있듯 sort() 의 정렬 순서는 문자열의 유니코드 코드 포인트를 따른다. 

 

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]

 

그래서 number를 정렬하려 할 때

이 예제의 array1.sort()의 결과처럼 number가 오름차순으로 정렬 되지 않는다.

그렇기 때문에 두번째 케이스에서 체점 오류가 났던 것이다. 

 

sort()를 사용해 number를 오름차순 해 주고 싶다면 어떻게 해야할까?

 

sort() 의 괄호 안에 정렬 순서를 정하는 함수를 넣어줄 수 있다. 

 

 

compareFunction이 제공되지 않으면 요소를 문자열로 변환하고 유니 코드 코드 포인트 순서로 문자열을 비교하여 정렬됩니다. 예를 들어 "바나나"는 "체리"앞에옵니다. 숫자 정렬에서는 9가 80보다 앞에 오지만 숫자는 문자열로 변환되기 때문에 "80"은 유니 코드 순서에서 "9"앞에옵니다.

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. 


  • compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
  • compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.
  • compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.
  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.


이 설명을 읽어보면 sort()안에 넣어주는 method의 두개의 인자가 

a-b <0 일 경우 a 를 먼저 오게 하고 

a-b=0 일 경우 변경하지 않고

a-b > 0 일 경우 b를 a보다 먼저 오게 한다고 한다. 

 

이 방법 자체가 수를 오름차순으로 정렬 하는 방법이다.

let new_array = array.slice(i-1,j).sort((a, b) => a - b);

그래서 이렇게 sort안에 (a,b)=> a-b  를 넣어주어 number의 정렬이 오름차순으로 되도록 해 주었다 .

 

내림차순으로 정렬 해 주고 싶다면 (a,b)=>b-a 를 넣어주면 된다.

 

이번 문제에서는 forEach를 썼다. for..in 이나 for..of 보다 forEach나 map같은 함수를 써 주는게 좋다고 

에어비앤비 자바스크립트 문서에 쓰여있었다. 아직 그 이유는 잘 모르겠지만 그렇게 쓰면서 공부 해나가려고 한다. 

 

문제 해결 코드 

 

 

 

 

댓글