자료구조와 알고리즘/programmers

정렬 > K번째 수

최문경 블로그 2021. 6. 15. 13:06

문제

 

 

코드

function solution(array, commands) {
    let answer = [];
    
    for (let i = 0; i < commands.length; i++) {
        const command = commands[i];
        const startIdx = command[0] - 1;
        const endIdx = command[1] - 1;
        const pickIdx = command[2] - 1;
        
        const sliceArray = array.map((item, idx) => {
            if (startIdx <= idx && idx <= endIdx) {
                return item
            }
        })
        const sortedArray = sliceArray.sort();
        answer.push(sortedArray[pickIdx])
    }
    
    return answer;
}

 

 

결과

왜 하나만 실패했을까..

 

 

수정 1

function solution(array, commands) {
    let answer = [];
    
    for (let i = 0; i < commands.length; i++) {
        const command = commands[i];
        const startIdx = command[0] - 1;
        const endIdx = command[1] - 1;
        const pickIdx = command[2] - 1;
        
        // const sliceArray = array.map((item, idx) => {
        //     if (startIdx <= idx && idx <= endIdx) {
        //         return item
        //     }
        // })
        
        const sliceArray = array.slice(startIdx, endIdx + 1);
        const sortedArray = sliceArray.sort();
        answer.push(sortedArray[pickIdx])
    }
    
    return answer;
}

slice 부분을 직접 구현한 것이 잘못되었나 싶어서 메서드를 사용했는데 결과는 처음처럼 테스트2만 실패했다.

그럼 sort에 문제가 있는 것 같아서 찾아보니 sort()만 할 경우 아스키코드 순서대로 정렬하기 때문에 제대로 정렬이 되지 않는다고 한다. 예를 들어, [1, 2, 10] 배열을 sort() 할 경우 [1, 10, 2]가 된다. 따라서, 크기 순으로 정렬하려면 인자를 넣어줘야 한다.

 

수정2

function solution(array, commands) {
    let answer = [];

    for (let i = 0; i < commands.length; i++) {
        const command = commands[i];
        const startIdx = command[0] - 1;
        const endIdx = command[1] - 1;
        const pickIdx = command[2] - 1;

        // const sliceArray = array.map((item, idx) => {
        //     if (startIdx <= idx && idx <= endIdx) {
        //         return item
        //     }
        // })

        const sliceArray = array.slice(startIdx, endIdx + 1);
        const sortedArray = sliceArray.sort((a, b) => a - b);
        answer.push(sortedArray[pickIdx])
    }

    return answer;
}

내림차순으로 정렬하려면 a - b를 b - a로 바꾸면 된다.

 

그리고 sort메서드는 정렬한 값을 반환하는 것이 아니라 원래 배열을 직접 정렬하기 때문에 굳이 다른 변수에 다시 넣어주지 않아도 된다.

// MDN
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

 

 

다른 사람의 풀이

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

우선 commands 자체를 map을 돌리면서 command를 조작해 결과값을 리턴한다.

그리고 구조 분해 할당으로 변수를 선언했고 filter와 sort를 이어서 적었다.

 

function solution(array, commands) {
    return commands.map(command => {
        const [sPos, ePos, goalPos] = command;
        const newArray = array.slice(sPos - 1, ePos).sort((a, b) => a - b);
        
        return newArray[goalPos - 1]
    })
}

위의 코드처럼 filter 부분을 slice로 변경하니 더 깔끔해진 것 같다. (변수명도 나름 바꿈)

'자료구조와 알고리즘 > programmers' 카테고리의 다른 글

정렬 > 가장 큰 수  (0) 2021.06.17