Notice
Recent Posts
Recent Comments
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

[JS] 정렬 > K번째수 본문

코딩테스트

[JS] 정렬 > K번째수

차차한 2022. 8. 18. 10:15

배열 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 함수를 작성해주세요.

 

문제만 봤을 땐 쉬워보였는데 생각보다 푸는데 어려웠던 문제..

commands가 2차원 배열로 되어 있어서 값을 가져오는게 자꾸 헷갈렸다

array : [1, 5, 2, 6, 3, 7, 4]

commands : [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

return : [5, 6, 3]

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

    commands.forEach((v,i) => {       
        answer.push(array.slice(v[0]-1, v[1]));      
    })

    answer.forEach((v,i) => {
        answer[i].sort((a,b) => a-b);
        re.push(answer[i][commands[i][2]-1]);
    })

    return re;
}

내가 작성한 코드

먼저 commands를 반복해서 array의 배열을 정해진 길이만큼 잘라줬다.

commands[0][1]이 2고 commands[0][1]이 5니까 array의 2번부터 5번까지 잘라서 answer 배열에 담고..그것을 commands 길이만큼 반복

주의해야할게 2와 5가 인덱스가 아닌 2번째위치, 5번째위치까지다.. 인덱스로 따지면 [1]과 [4].

slice는 첫 번째 인덱스부터 두 번째 인덱스 전까지 잘라주는 메소드기 때문에 첫 번째 인덱스엔 1을 빼서 array의 1번부터 4번까지 잘라줬다.

answer에 잘라 담게 되면 answer도 2차원 배열이 된다 

다음 오름차순으로 정렬을 해주고 정렬한 배열에서 commands[i][2]의 위치를 찾아 다시 배열에 담아야 한다.

answer 배열을 반복문으로 돌리면서 answer의 i 인덱스에 있는 배열에서 commands의 [i][2]-1 위치의 값을 찾아 새로운 배열 re에 담았다.

여기서 commands가 가리키는 위치도 인덱스가 아닌 몇 번째 자리이기 때문에 1을 빼줬다

answer 배열과 commands 배열 길이가 동일하기 때문에 같이 i로 인덱스를 정했댜

 

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으로 반복했다.

value를 command로 받고 const [sPosition, ePosition, position] = command로 commands의 같은 인덱스에 있는 값끼리 묶었다.

array는 filter로 반복을 돌리면서 array인덱스가 시작 숫자(sPosition)-1 ~ 종료숫자(ePosition)-1 까지인 경우만 배열에 담고 (=> 인덱스를 찾아 그 범위만큼만 배열에 저장) sort로 정렬을 해줬다.

그 후에 정렬된 newArray 배열에서 position - 1의 위치를 찾아 반환해줬다

사용한 메소드를 보면 무슨 말인지 알겠는데 정확히 어떻게 작동?되는지는 확실히 모르겠다..

 

 

Comments