[Javascript] 프로그래머스 Level1 _ K번째수
👇🏻
👇🏻
시행착오
( + 코드를 작성하면서든 생각들.)
1.
일단 for반복문으로 구성하면서 문제를 파악해봤다.
commands 의 내부 배열이 1개 이상이기 때문에 원본에 영향을 미치지않도록
splice() 대신 slice()를 통해 원하는 조건만큼 배열을 복사했다.
인덱스 대신 번째로 표현하고 있어서 end를 제외하고 각각 -1을 해주었다.
slice()의 경우 start index ~ end index 전 까지 복사하기 때문에 end는 손대지않았다.
정확성 테스트 2번에서 막혀서 85.7점이 나왔다 ㅠㅠ
function solution(array, commands) {
var answer = [];
var temp = [];
for(let i=0; i<commands.length; i++){
var start = commands[i][0] -1;
var end = commands[i][1];
var target = commands[i][2] -1;
temp = array.slice(start, end).sort();
answer.push(temp[target]);
}
return answer;
}
2.
아마도 sort()에 정렬 순서를 정의하지않아서 그런 것 같아서 sort((a,b) => a-b)로 오름차순임을 명시해줬다.
그랬더니 테스트를 모두 통과할 수 있었다.
function solution(array, commands) {
var answer = [];
var temp = [];
for(let i=0; i<commands.length; i++){
var start = commands[i][0] -1;
var end = commands[i][1];
var target = commands[i][2] -1;
temp = array.slice(start, end).sort((a,b)=>a-b);
answer.push(temp[target]);
}
return answer;
}
프로그래머스 문제를 풀면서 sort() 함수를 굉장히 많이 사용했다.
복잡한 반복문 없이도 문자나 숫자를 정렬할 수 있다게 큰 이유였다.
하지만, sort() 함수는 문자열을 유니코드 코드 포인트(고유한 숫자 값)를 기준으로 정렬 해주는 함수이다.
그렇기 때문에 예제 처럼 [1, 4, 21, 30, 100000]이 아닌 [1, 100000, 21, 30, 4]가 리턴이 되는 것이다.
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]
그래서 결론은 숫자에 sort()를 사용하는 경우,
(정확도를 위해) 오류를 방지하기위해 정렬 순서를 간단하게 화살표 함수로 정의해주는 것이 좋다.
+)
MDN에서 sort()가 stable sort가 아님을 명시해놓았는데 이것은 중복 값의 정렬에 해당하는 이야기이다.
구글링으로 stable sort 와 unstable sort의 차이점을 검색해보자!
⚠️ 아래 내용은 모두 개인적인 참고 / 기록을 위한 용도입니다. 참고해주시고 편안하게 봐주세요 :) ⚠️
*** 혹시라도 잘못된 정보가 있다면 언제든지 알려주시면 감사하겠습니다 ! ***
'Programmers > Level 1' 카테고리의 다른 글
[Javascript] 프로그래머스 : 두 정수 사이의 합 (0) | 2021.07.06 |
---|---|
[Javascript] 프로그래머스 : 문자열 내림차순으로 배치하기 (0) | 2021.07.04 |
[Javascript] 프로그래머스 : 문자열 내 p와 y의 개수 (0) | 2021.07.03 |
[Javascript] 프로그래머스 : 문자열을 정수로 바꾸기 (0) | 2021.07.03 |
[Javascript] 프로그래머스 : 문자열 다루기 기본 (0) | 2021.07.03 |