[코드테스트] K번째수

이강민·2021년 11월 3일
0

[코드테스트]Javascript

목록 보기
13/39
post-thumbnail

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

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

문제풀이

비교적 쉽게 푸는 듯 했지만 sort에 대해서 정확히 알지 못해 사용하여 오류가 발생했다.
sort를 사용할 때 만약 아무것도 매개변수를 주지 않으면 ASCII 문자 오름차순으로 정렬이 되는데 이 부분에서 얘기치 못한 오류가 발생 한 것 같다.
그래서 이 부분을 명확하게 sort 매개변수에 콜백함수를 넣어 오름차순으로 정렬을 시켰더니 오류가 발생하지 않았다. 가능하면 sort 매개변수를 생략하지 말고 사용하자.
sort의 자세한 내용은 Javascript-12의 맨 하단에서 설명한다.

//코드 테스트 전 직접 시험해보기 위해 작성한 부분
const array = [1, 5, 2, 6, 3, 7, 4];
const commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]];

function solution(array, commands) {
//answer에 commands 에서 요구한 수를 담기 위해 배열로 만들었다.
  let answer=[];
//commands의 길이 만큼 반복시켜서 result에 값을 담았다. 
    for (let i = 0; i < commands.length; i++) {
      //array의 배열을 commands[i]의 첫번째 요소의 -1에서부터 commands[i]의 두번째 요소 까지 slice를 시켜 값을 추려내고 sort를 이용하여 배열을 정렬하였다.(매개변수를 넣지 않으면 일부 오류가 발생함)
            let result = array.slice(commands[i][0]-1, commands[i][1]).sort((a,b) => a-b);
      //answer이라는 새로운 배열에 result의 값 중 commands[i][2]-1 번째 수를 push하였다.
            answer.push(result[commands[i][2]-1]);            
    }
  //answer에는 배열이 반복하면서 push된 값들이 배열형태로 담겨있다.
    return answer;
}
//함수를 실행.
solution(array, commands);

다른사람의 풀이

원리는 같으나 commands의 map API를 이용하여 array의 값을 slice와 sort를 이용하여 담았으며 추가적으로 요구하는 값도 slice를 이용하여 값을 추려냈다.
map은 결과적으로 배열을 반환하고 value와 index, array의 3개의 매개변수를 받는다.
아래에서는 단순 value를 받지만 commands는 2차원배열로 실질적으로 배열을 받았다.


function solution(array, commands) {
    return commands.map(v => {
      //v는 commands의 값(배열)들이다. 
        return array.slice(v[0] - 1, v[1])
          	    .sort((a, b) => a - b)
      //array를 slice시켜 값을 추려내고 sort로 값을 다시 정렬했다.
      // 정렬한 값을 다시 세번째 값만 추려내고 그 값[0]을 map으로 정렬하였다. 
      //map이 완료된 commands는 바로 return 되어 값을 냄.
          	    .slice(v[2] - 1, v[2])[0];
    });
}
profile
AllTimeDevelop

0개의 댓글

관련 채용 정보