[프로그래머스] 코딩테스트 연습 - K번째 수 (javascript)

지미노·2022년 8월 4일
0

코딩테스트

목록 보기
4/40
post-thumbnail
post-custom-banner

문제 설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.

처음 문제 보면서 생각한 메서드들
Array.prototype.slice

arr.slice( i - 1 , j )

배열의 index는 0부터 시작하기 때문에 i에는 1을 빼주고,
slice의 두번째 인수는 해당 인덱스를 미포함하기 때문에 그대로 사용해도 된다.


배열의 정렬은 Array.prototype.sort

기본적으로 오름차순으로 정렬해주기 때문에 그대로 써도 될 것 같지만 숫자는 제대로 작동하지 않기 때문에 조금 손을 봐주어야 한다.

arr.sort((a, b) => a - b);

sort 메서드는 원본 배열을 직접 변경하기 때문에
arr을 그대로 끌어오면 된다.

배열의 k번째 숫자니까 인덱스로 치면 k+1이 되겠다.

arr[k + 1];


일단 문제부터 보면서 생각해보자면 commands에 i, j, k 라는 인수들이 들어간 배열이 여러개 있는거니까 이 commands에 있는것들을 다 돌려줄 때 까지 for문으로 반복해주어야 할 것 같다. 이걸 식으로 하면

for (i = 0; i < commands.length; i++) {}

이제 어떤 걸 반복하기 전에 어떤 변수들이 필요할 지 선언해야한다.
생각해보니 for문의 변수가 뒤에 선언 할 변수와 겹치기 때문에 a로 바꿔주었다.

for (let a = 0; a < commands.length; a++) {
	let arr = [];
    let i = commands[0];
    let j = commands[1];
    let k = commands[2];
    }

밑에는 내가 제출한 메서드들을 포함한 정답 코드

function solution(array, commands) {
    answer = []
    for ( let a = 0; a < commands.length; a++) {
        arr = commands[a];
        let i = arr[0];
        let j = arr[1];
        let k = arr[2];
        newArr = array.slice(i - 1, j);
        newArr.sort((a, b) => a - b);
        answer.push(newArr[k - 1]);
    }
    return answer;
}

다른 사람 답안 보니까 array map 매서드를 이용한 답안들이 많이 보이던데
공부해봐야겠다!



▼공부해보고 다시 복기해볼 답안들▼

function solution(array, commands) {
    return commands.map(command => {
        const [sPosition, ePosition, position] = command
        const newArray = array
            .filter((value, fIndex) => fIndex >= sPosition - 1 && fIndex <= ePosition - 1)
            .sort((a,b) => a - b)    

        return newArray[position - 1]
    })
}
function solution(array, commands) {
    return commands.map(v => {
        return array.slice(v[0] - 1, v[1]).sort((a, b) => a - b).slice(v[2] - 1, v[2])[0];
    });
}
post-custom-banner

0개의 댓글