프로그래머스 - K번째 수

이진성·2022년 6월 1일
0

알고리즘

목록 보기
2/2

문제설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

고민

  1. array에서 i번째 수 ~ j번째 수 까지 어떻게 자를 것인가?
  2. sort 방법은?
  3. k번째 수를 찾는 방법은?

사실 sort 방법이나, k번째 수를 찾는 건 문제가 없었다. 기존 javascript에서 sort를 이용해서 오름차순으로 정렬하는 것을 해봤기 때문이다.
제일 고민이 많이 되는 것은 1번 array를 어떻게 자를 것인가? 이것인데 방법은 다양하다고 생각했다. slice를 이용해서 자를 수도 있고, for문을 이용해서 자를 수도 있고 내가 생각하지 못한 방법으로 자를 수도 있을 거라고 생각했다.

소스코드

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

다른 사람의 소스 코드 분석

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]
    })
}

내가 사용한 방법에서 for문을 map을 이용했고, array의 filter기능을 이용해서 index범위가 해당하는 범위의 값만 newArray라는 새로운 배열에 넣어줬다.

const [sPosition, ePosition, position] = command는 한눈에 봐도 엄청 직관적으로 보여서 깔끔한 코딩이 가능한거 같다. 이런 코딩을 배워야 하는데 언제쯤 가능 할지....

깨달은 점

내가 지금 까지 사용하지 않았던 기능들 filter 같은 기능들을 이용하면, 훨씬 깔끔하고 멋진 source 코드를 작성할 수 있는 것 같다.
또한 javascript의 개념 및 기초가 부족한 것 같아서 조금 더 공부를 해야 할 것 같다.

profile
좋은 소스 코드를 연구하는 개발자

0개의 댓글