본문 바로가기

알고리즘문제

[알고리즘] K번째수 (프로그래머스 - 자바스크립트 풀이)

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제를 보고 먼저 드는 생각은 역시 반복문 돌리기다.

 

 

commands

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

 

먼저 commands의 각 요소인 배열의 수들을 골라내야 한다.

 

2 : array의 2번째 수부터 ( array[1] )

5 : array의 5번째 수까지 배열로 추출하고 오름차순 정렬 후 ( array[4] )

3 : 정렬된 새로운 배열의 3번째 수를 구하면 된다. ( newArray[2] )

 

 

처음엔 for 문을 중첩으로 돌려보다가

 

 

이 제한사항을 보고 단일 for문을 사용했다.

 

for (var i = 0; i < commands.length; i++) {
  var start = commands[i][0]; // 2번째 (5 부터)
  var end = commands[i][1]; // 5번째 (3 까지)
  var num = commands[i][2]; // 그 중에서 정렬 후 3번 째 수 (2, 3, 5, 6 중 5);

// 중략...
* 원래는 var를 쓰지 않았었는데 VSC에서 코드 작성 후 답안지에 옮길 때 무조건 var로 바꿔줘야 해서 그냥 사용
먼저 commands의 각 원소(배열)의 길이는 3 고정이기 때문에, [i][0],[i][1],[i][2] 이렇게 고정된 숫자를 사용했다.

 

각각 변수에 2, 5, 3 숫자를 차례대로 넣었으니 array 배열을 잘라낼 차례다.

 

새로운 배열을 반환하는 slice() 메소드를 사용했다.

 

var newArr = array.slice(start - 1, end).sort((a, b) => a - b);
// [5, 2, 6, 3] 정렬 후 => [2, 3, 5, 6]
slice(n번 인덱스부터, n번 인덱스까지(미포함)) 를 잘라내어 새로운 배열을 반환한다. 원본 배열은 그대로 유지된다.
먼저 start 변수에 들어있는 숫자는 2이다. 그런데 인자값으로 2를 그대로 넣으면 2번 인덱스 숫자를 지정하게 되니,
2번째 수가 아닌 3번째 수가 된다. 그래서 -1을 해주어야 한다.
end 변수는 n번 인덱스까지지만 자신을 포함하지 않기때문에 그대로 사용해야 한다.
헷갈린다면 임의로 배열을 만들어서 인자 값을 바꿔가며 여러 번 사용해 보면 감이 잡힐 것이다.
그리고 제대로 잘라냈다면 sort() 메소드를 사용해서 오름차순으로 정렬해 준다.

 

이제 정답으로 제출할 빈 배열 answer 변수에 push() 메소드를 사용해서 요소로 넣어주면 끝이다.

 

  answer.push(newArr[num - 1]);
} // for문 종료
배열에 요소를 넣을 때도 문제에서 원하는 건 3번째 수이기 때문에 인덱스 번호에서 -1을 해주어야 한다.

 

 

제출한 정답 코드

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

  for (var i = 0; i < commands.length; i++) {
    var start = commands[i][0]; // 2번째 (5 부터)
    var end = commands[i][1]; // 5번째 (3 까지)
    var num = commands[i][2]; // 그 중에서 정렬 후 3번 째 수 (2, 3, 5, 6 중 5);

    // slice(n번 인덱스부터, n번 인덱스까지 (미포함));
    var newArr = array.slice(start - 1, end).sort((a, b) => a - b);
    answer.push(newArr[num - 1]);
  }

  return answer;
}