[Lv1] K번째 수

이말감·2022년 8월 14일
0

Programmers

목록 보기
27/32

프로그래머스 Lv1 K번째 수

문제

링크

풀이

function solution(array, commands) {
    return commands.map((item) => {
        return array.slice(item[0]-1, item[1]).sort((a, b) => a - b)[item[2]-1];
    });
}

이 문제는 sort를 제대로 알고 있어야 간단하게 나타낼 수 있다.
저번에 프로그래머스 가장 큰 수를 풀면서 sort에 대해 알았는데 그 새 까먹었다.

자바스크립트에서 sort를 사용하면 배열은 문자열로 변환되어 정렬된다.
그러므로 숫자를 정렬하기 위해선 매개변수로 함수를 설정해주어야 한다.

sort

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,

compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다. (오름차순)
compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.
compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다. (내림차순)
compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.

구조분해할당

위의 코드에서는 적용하지 않았지만, 푸는 과정에서 구조분해할당을 사용했기 때문에 정리해보자.

i, j, k를 선언하고 할당할 때

const i = item[0];
const j = item[1];
const k = item[2];

이렇게 각각 할당하면 코드의 길이가 너무 길어진다.
이를 해결하기 위해 구조분해할당을 사용해보자.

// 예시
var foo = ["one", "two", "three"];

var [red, yellow, green] = foo;

이렇게 배열 형태로 되어있을 경우, 위와 같이 할당할 수 있다.
문제에서 예시와 동일하게 적용하면 아래와 같다.

const [i, j, k] = item;

item이 배열이기 때문에 동일한 배열 형태로 나타내면 각각 순서대로 할당이 된다.

slice

arr.slice([begin[, end]])
// slice(시작[, 끝])

// 예시
const arr = [1, 2, 3, 4, 5];

// 2번째 원소부터 끝까지
console.log(arr.slice(2));
// [3, 4, 5]

// 1번째 원소부터 3번째 직전(2번째)까지
console.log(arr.slice(1, 3));
// [2, 3]
profile
전 척척학사지만 말하는 감자에요

0개의 댓글