코딩/프로그래머스 코딩테스트

[프로그래머스] K번째수

민쯔 2021. 10. 2. 01:23
728x90
반응형

안녕하세요. 민쯔입니다.😊

이번에는 K번째수 문제 해결방안에 대해 설명하겠습니다.

이 문제는 문제 설명에서

배열 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입니다.

로 되어있습니다.

 

저는 이문제 보자마자 

몇 번부터 몇 번째까지 자르면 : slice();

 배열을 정렬하면 : sort();

를 쓰면 되겠다는 생각이 들었어요.

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

let sliceArr = [];

  • 저는 몇번부터 몇 번째까지 자를 때 담을 배열을 만들었습니다.

 

for(let a=0; a<commands.length; a++)

  • commands.length : 3
    • commands[[2, 5, 3], [4, 4, 1], [1, 7, 3]]
  • for문에서 a는 0, 1, 2이 나옵니다.

 

let i = commands[a][0];

let j = commands[a][1];

let k = commands[a][2];

  • "배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다."에 있는 i, j, k를 그대로 가지고 왔습니다.
  • 만약 a가 0이라고 하면
    • commands[[2, 5, 3], [4, 4, 1], [1, 7, 3]]
    • let i = commands[0][0]; = 2 
    • let j = commands[0][1]; = 5
    • let k = commands[0][2]; =3

 

sliceArr = array.slice(i-1, j);

  • slice : 배열의 시작부터 끝까지에 대해 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.
  • slice(첫 번째 자리, 마지막 자리);
  • 첫번째 자리에 i-1을 넣은 이유는 slice에서는 0부터 시작하는데 문제설명에서는 1부터 시작하기 때문에 -1를 넣었습니다.
  • 이러면 "i번째 숫자부터 j번째 숫자까지 자르고"까지 해결이 됩니다.

 

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

  • sort() : 배열 정렬
  • sort()만 쓰면 테스트2번에서 계속 오류가 납니다.
  • 이유는 잘은 모르겠는데 compareFunction이 없어서 그런 거라고 하더라고요.
    • sort((a,b)=>a-b); //오름차순
    • sort((a,b)=>b-a); //내림차순
  • "정렬했을 때" 해결

 

answer.push(sliceArr[k-1]);

  • answer빈배열에다가 k번째에 있는 수를 push를 사용해서 넣어주었습니다.
  • k-1를 넣은 이유는 0부터 시작이 아닌 1부터 시작으로 되어 있어 -1를 해주었습니다.

여기까지 해결방법이었습니다.

이번 꺼는 뭔가 풀만했는데 묘하게 돌아가는 기분이 드는데 맞게 푼 거겠지요ㅋㅋ

다들 map이라 filter 쓰던데 뭔가 이해가 잘 안돼서 제가 이해하는 방향으로 풀어보았어요.

 

728x90
반응형