[코딩테스트 연습] K번째 수_Level.01
코딩테스트/JavaScript

[코딩테스트 연습] K번째 수_Level.01

_2019.04.15.MON_

 

오늘의 첫 문제 '완주하지 못한 선수'에서 털리고 두 번째 문제를 풀어본다.

이번 문제는 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입니다.

 

 


 

문제를 접했을 때 나는 이렇게 생각했다.

 

  • 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
    • slice( )함수와 sort( )함수를 사용해야겠다.
    • array.slice( i, j );
    • newArray.sort( );   // 여기서 newArray는 i와 j번째 숫자까지 자른 배열
    • newArray[ k-1 ];     // 정렬하고 난 뒤 newArray에서 구하고자 하는 k번째 수
  • 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때,
    • commands는 array [i, j, k]를 원소로 가지고 있는 2차원 배열이다.
    • 즉, commands의 원소에 나와 있듯이 배열을 i부터 j까지 자르고 정렬한 뒤 k번째 수를 찾아야 한다.
  • commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return하도록 solution 함수를 작성해주세요.
    • 만약 commands가 3가지 array[i, j, k]를 가지고 있다면, 3가지 결과를 순서에 맞게 배열 형태로 return.

 

 

 

아래는 내가 작성한 코드이다.

 


 

[작성한 코드]

( _ .slice( ) : 만약 jvAry 배열의 n번째 요소부터 m번째 요소까지 선택하고 싶으면, jvAry.slice( n-1, m ); )

function solution(array, commands) {
    
    let answer = [];
    const horizontal = commands.length;
    
    for(let t=0; t<horizontal ; t++){
        
        let i = commands[t][0];
        let j = commands[t][1];
        let k = commands[t][2];
        
        let newArray = array.slice(i-1, j);
        newArray.sort();
        answer[t] = newArray[k-1];
        console.log("k는 " + answer[t]);
        
    }
    
    return answer;
}

 

 

[실행 결과]

...더보기
테스트 1
입력값 [1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]]
기댓값 [5, 6, 3]
실행 결과 테스트를 통과하였습니다.
출력 k는 5
k는 6
k는 3

테스트 결과 (~˘▾˘)~

1개 중 1개 성공

 

 

[채점 결과]

...더보기

채점을 시작합니다.

같은 코드로 채점한 결과가 있습니다.

정확성 테스트

테스트 1 통과 (3.64ms, 36.6MB)
테스트 2 〉 실패 (6.62ms, 37.2MB)
테스트 3 통과 (4.18ms, 36.8MB)
테스트 4 통과 (4.25ms, 36.7MB)
테스트 5 통과 (4.25ms, 36.9MB)
테스트 6 통과 (3.71ms, 38.6MB)
테스트 7 통과 (4.48ms, 36.5MB)

채점 결과

정확성: 85.7

합계: 85.7 / 100.0

 

 

실행은 제대로 됐는데 틀렸다. 세상에...허윽 이번엔 잘된줄 알았다.

그런데 왜 틀린지 모르겠다. 이게 더 문제다.

 

우선 OKKY QnA게시판에 올렸으니 답이 올라오면 마저 작성해야겠다..

 

 


답을 알아냈다!  내 코드 중에

newArray.sort();

라는 코드가 있는데 이걸

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

로 바꾸니 정상 작동하였다! 아마 문자로 인식하고 정렬하여 오류가 생긴 모양이다.

 

답변을 달아주신 분 중 한 분 말로는 이게 왜 문자로 인식/정렬 되는지 알고 싶으면

[1, 10, 101, 61, 45].sort();

를 해보면 이해가 갈거라고 하셨다.ㅇ/★

 

 


[정답 코드]

 

function solution(array, commands) {
    
    let answer = [];
    const horizontal = commands.length;
    
    for(let t=0; t<horizontal ; t++){
        
        let i = commands[t][0];
        let j = commands[t][1];
        let k = commands[t][2];
        
        let newArray = array.slice(i-1, j);
        newArray.sort((a, b) => a-b);
        answer[t] = newArray[k-1];
        console.log("k는 " + answer[t]);
        
    }
    
    return answer;
}