개발조각

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

알고리즘🅰/프로그래머스

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

개발조각 2022. 2. 9. 14:24
728x90
반응형

2021.10.02에 푼 문제입니다.

 

이번 문제는 2차원 배열이 나와서 조금 애먹었지만 풀만한 문제입니다.

 

저는 이문제 보자마자

  • 몇 번부터 몇 번째까지 자르면 : 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;
}

 

해결방안 순서

  1. commands배열을 for문으로 돌립니다.
  2. commands 2차원 배열의 첫 번째 자리부터 시작해서 i, j, k를 만듭니다.
  3. 2단계에서 나온 i, j를 활용해서 i번째부터 j번째까지 잘라주고 sliceArr배열에 담아줍니다.
  4. sliceArr배열을 오름차순으로 정렬해줍니다.
  5. 4단계에서 정렬한 SliceArr배열을 2단계에서 나온 k를 활용하여 k번째 숫자를 answer배열에 담아줍니다.
  6. 1단계부터 5단계까지를 commands의 2차원 배열만큼 반복해주어 answer배열에 담아줍니다.

 

 

1단계. commands배열을 for문으로 돌리기

이 문제가 2차원 배열이기 때문에 배열을 각각 제어해야 된다고 생각이 들었습니다.

 

테스트 1을 예시로 들자면

commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]] 을

[2, 5, 3]

[4, 4, 1]

[1, 7, 3]

이런 식으로 각각 나누어 slice, sort를 해주고 값을 배열에 담아주면 되겠고

for문을 3번을 돌리면 풀 수 있겠다고 생각했습니다.

 

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

테스트 1을 예시로 설명

  • commands.length : 3 ->[2, 5, 3] [1, 7, 3] [4, 4, 1] 3개
  • for문에서 a는 0, 1, 2 -> 3번 반복

 

2단계. commands 2차원 배열의 첫 번째 자리부터 시작해서 i, j, k를 만듭니다.

1단계에서 for문을 만들고 for문안에는 테스트1을 예시로 설명하자면

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

  • 첫 번째 자리 : 2, 4, 1 -> 변수 i
  • 두 번째 자리 : 5, 4, 7 -> 변수 j
  • 세 번째 자리 : 3, 1, 3 -> 변수 k

로 만들어 주어야 됩니다.

 

let i = commands[a][0];
let j = commands[a][1];
let k = commands[a][2];

 

테스트 1을 예시로 설명
array = [1, 5, 2, 6, 3, 7, 4] commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

a=0일 때
let i = commands[a][0]; ->2
let j = commands[a][1]; -> 5
let k = commands[a][2]; -> 3
[2, 5, 3]

a=1일 때
let i = commands[a][0]; -> 4
let j = commands[a][1]; -> 4
let k = commands[a][2]; -> 1
[4, 4, 1]

a=2일 때
let i = commands[a][0]; -> 1
let j = commands[a][1]; -> 7
let k = commands[a][2]; -> 3
[1, 7, 3]

 

3단계. 2단계에서 나온 i, j를 활용해서 i번째부터 j번째까지 잘라주고 sliceArr배열에 담아줍니다.

MDN Web Docs
slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.

구문 : 배열.slice(배열의 시작 index, 배열의 종료 index);

만약 배열.slice(0,3); -> 배열 0부터 2까지 추출

 

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

  • i-1 : 문제에서는 배열의 첫 번째 자릿수가 0번이 아니라 1번이라서 i-1을 해주었습니다.
  • j : slice에서는 자동으로 -1만큼 추출해줘서 j로 써주었습니다. 
테스트 1을 예시로 설명
array = [1, 5, 2, 6, 3, 7, 4] commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

a=0일 때
let i = commands[a][0]; ->2
let j = commands[a][1]; -> 5
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [5, 2, 6, 3]

a=1일 때
let i = commands[a][0]; -> 4
let j = commands[a][1]; -> 4
let k = commands[a][2]; -> 1
sliceArr = array.slice(i-1, j); -> [6]

a=2일 때
let i = commands[a][0]; -> 1
let j = commands[a][1]; -> 7
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [1, 5, 2, 6, 3, 7, 4]

 

4단계. sliceArr배열을 오름차순으로 정렬해줍니다.

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

MDN Web Docs
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

구문 : 배열.sort(정렬 순서를 정의하는 함수)

 

sort() 메서드로는 오름차순과 내림차순으로 정렬할 수 있습니다.

프로그래머스에서 자주 사용하니까 꼭 외우시길 바랍니다.!!

  • sort((a,b)=>a-b); -> 오름차순
  • sort((a,b)=>b-a); -> 내림차순

여기서 sort()만 써도 오름차순이 되지만 이렇게만 쓰면 제출 후 채점하기 테스트 2번에서 계속 오류가 나옵니다.

정확한 이유는 잘 모르겠는데 compareFunction이 없어서 그런 거라고 하더라고요.

테스트 1을 예시로 설명
array = [1, 5, 2, 6, 3, 7, 4] commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

a=0일 때
let i = commands[a][0]; ->2
let j = commands[a][1]; -> 5
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [5, 2, 6, 3]
sliceArr.sort((a,b) => a - b); -> [2, 3, 5, 6]

a=1일 때
let i = commands[a][0]; -> 4
let j = commands[a][1]; -> 4
let k = commands[a][2]; -> 1
sliceArr = array.slice(i-1, j); -> [6]
sliceArr.sort((a,b) => a - b); -> [6]

a=2일 때
let i = commands[a][0]; -> 1
let j = commands[a][1]; -> 7
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [1, 5, 2, 6, 3, 7, 4]
sliceArr.sort((a,b) => a - b); -> [1, 2, 3, 4, 5, 6, 7]

 

5단계. 4단계에서 정렬한 SliceArr배열을 2단계에서 나온 k를 활용하여 k번째 숫자를 answer배열에 담아줍니다.

MDN Web Docs
push() 메서드는 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다.

구문 : 배열.push(배열 끝에 추가할 요소)

 

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

  • k-1 : 앞에서도 얘기했다시피 이 문제에서는 배열이 0부터 시작되는 게 아니라 1부터 시작이 되어 k-1을 넣어주었습니다.
테스트 1을 예시로 설명
array = [1, 5, 2, 6, 3, 7, 4] commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

a=0일 때
let i = commands[a][0]; ->2
let j = commands[a][1]; -> 5
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [5, 2, 6, 3]
sliceArr.sort((a,b) => a - b); -> [2, 3, 5, 6]
answer.push(sliceArr[k-1]); -> 5

a=1일 때
let i = commands[a][0]; -> 4
let j = commands[a][1]; -> 4
let k = commands[a][2]; -> 1
sliceArr = array.slice(i-1, j); -> [6]
sliceArr.sort((a,b) => a - b); -> [6]
answer.push(sliceArr[k-1]); -> 6

a=2일 때
let i = commands[a][0]; -> 1
let j = commands[a][1]; -> 7
let k = commands[a][2]; -> 3
sliceArr = array.slice(i-1, j); -> [1, 5, 2, 6, 3, 7, 4]
sliceArr.sort((a,b) => a - b); -> [1, 2, 3, 4, 5, 6, 7]
answer.push(sliceArr[k-1]); -> 3

여기까지 프로그래머스 K번째수 해결방안에 대해 설명해보았습니다.

 

이번 꺼는 뭔가 풀만했는데 묘하게 돌아가는 기분이 드는데 맞게 푼 거겠지요.😅
다들 map이라 filter 쓰던데 이해가 잘 안돼서 제가 이해하는 방향으로 풀어보았어요.

728x90
반응형
Comments