[매일코딩-프로그래머스] K번째수 02

2021. 11. 11. 10:52WEB Dev/CordingTEST

728x90

 

 

 

어제 못 푼 정렬의 K번째수를 시도해보자!

 

문제는 

var array = [1, 5, 2, 6, 3, 7, 4];
var commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]];

commands 배열의 첫번째 요소인 [2, 5, 3] 배열의 첫번째 요소를 i라고 하고, 두번째 요소를 j라고 하고, 세번째 요소를 k라고 했을 때 

array 배열을 i번째부터 j번째까지 자르고, 정렬한 다음, k번째 숫자를 찾아서 모아서 배열에 담아 return하는 것이 과제다.

 

우선 배열을 3개 선언한다.

1. 시작할 n번째 수를 모아둘 startArray라는 배열

2. 끝나는 부분의 n번째 수를 모아둘 endArray 배열

3. 그리고 골라낼 n번째 수를 모아둘 orderArray 배열

 

그리고 commands에서 배열을 만들 반복문을 생성한다.

여기서 array.slice를 할 때 n번째와 n번째 인덱스는 다르기 때문에(-1 차이)

startArray의 값과 orderArray는 -1을 해서 배열에 넣는다.

endArray의 값은 자동으로 n-1번째가 될 것이기 때문에 따로 -1 하지 않는다. ( slice(n, n-1) )

  var startArray = [];
  var endArray = [];
  var orderArray = [];

  for(var idx=0; idx<commands.length; idx++){
       startArray.push(commands[idx][0]-1);
       endArray.push(commands[idx][1]);
       orderArray.push(commands[idx][2]-1);
     };

 

이렇게 돌리면 startArray는 [1, 3, 0] (원래 [2. 4. 1]) 이 되고,

endArray는 [5, 4, 7]

orderArray는 [2, 0, 2] (원래 [3, 1, 3]) 이 된다.

이것이 각각 i번째 숫자의 배열, j번째 숫자의 배열, k번째 숫자의 배열이 된다.

 

그러면

array.slice(startArray[0], endArray[0]).sort()[orderArray[0]];

와 같이 array를 잘라서 마지막 값을 얻어낼 수 있는데 이것을 반복하여 answer 배열에 넣어주면 된다.

 

 


 

이렇게 풀어서 반복문 안에 넣고 진행했는데..!

 

테스트 2만 통과가 안되어서 5분을 끙끙대다가 질문하기에서 답을 찾았다.

sort() 메소드의 유니코드 정렬에 sort에게 숫자를 정렬하는 방법을 알려줘야 하는 것이다.

위의 .sort()부분에 .sort((a,b)=>a-b) 을 넣어주면 된다.

 

안 그러면 배열 내의 숫자를 유니코드 방식으로 정렬해버리기 때문에 오류가 날 수 있다는 것.

반드시 기억하자..!

 

 

 

아래는 내 제출 함수 코드고

var array;
var commands;
    
var startArray = [];
var endArray = [];
var orderArray = [];
var answer = [];

function solution(array, commands) {

    for(var idx=0; idx<commands.length; idx++){
       startArray.push(commands[idx][0]-1);
       endArray.push(commands[idx][1]);
       orderArray.push(commands[idx][2]-1);
        
       answer.push(array.slice(startArray[idx], endArray[idx]).sort((a, b) => a - b)[orderArray[idx]]);

    };

    return answer;
    
}

 

좋은 정답이 많아서 참고삼아 복사해왔다.

내 것 보다 훨씬 더 간결한 코드  😥😥

같은 방식인데 엄청 예쁘고 깔끔하다. 내거랑 비교해 보면 내 코드는 매머드급이다.

 

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

    for(let i = 0; i < commands.length; i++) {
        sliceArray = array.slice(commands[i][0] - 1, commands[i][1]).sort((a, b) => a - b);   
        answer.push(sliceArray[commands[i][2]-1]);
    }    

    return answer;
}

 

내가 하고 싶었던 .map() 사용. 눈에 많이 익혀놔야지.....

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

 

이것도 써보고 싶었던 for...of문 😂

function solution(array, commands) {
    var answer = [];
    for(let value of commands){
        answer.push(array.slice(value[0]-1, value[1]).sort((a,b)=>a-b)[value[2]-1]);
    }
    return answer;
}

 

 

언젠간 고급 문법도 자유롭게 쓸 수 있겠지...?

 

728x90