코딩테스트(2) - K번째 수

GAHEE KIM·2022년 1월 10일
0

문제링크

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

문제

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면 array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.

생각의 흐름

  1. commands는 길이가 3인 배열로 된 배열이기때문에 map?/for?로 각 배열을 돌면서 해당 배열원소로 array를 slice하기
  2. 배열의 인덱스는 0부터 시작하기 때문에 i번째는 i-1로 slice start index로 설정한다.
  3. slice end index에 해당하는 값은 잘라내지않기때문에 그대로 둔다.
  4. slice된 배열을 sort()를 통해 오름차순 정렬
  5. 정렬된 배열에서 commands 3번째 값을 반환

1차 시도 (map적용)

function solution(array, commands) {
    let newArray = [];
    commands.map((itm)=>{
    const sliced = array.slice(itm[0]-1,itm[1]).sort();
    newArray.push(sliced[itm[2]-1]);
})
    return newArray
}

테스트 결과

2차 시도 (for문 적용)

function solution(array, commands) {
    let newArray = [];
   for (const com of commands) {
      const slicedArray = array.slice(com[0] - 1, com[1]).sort();
      newArray.push(slicedArray[com[2] - 1]);
    }
    return newArray;
}

테스트 결과

3차 시도

map과 for문을 비교했을때 map이 훨씬 효율적으로 빨리 결과를 도출해냈다.
하지만 둘 다 1개의 테스트를 통과하지못했고, 혼자서는 원인을 찾지 못해서 검색을 통해 알아보았다.

원인은 sort의 문제.

나는 습관처럼 문자열이 아닌 숫자비교임에도 sort()로 배열을 배워둔 상태로 sorting을 시도했다.

sort함수는 비워놓은 상태로 사용하게되면 문자열로 변환하여 유니코드로 정렬을 한다.

따라서 숫자를 비교하기 위해서는 sort함수에 인자를 넣어서 오름차순을 위해서는 a-b를, 내림차순을 할때는 b-a로 리턴하도록 한다.

function solution(array, commands) {
    let newArray = [];
    commands.map((itm)=>{
    const sliced = array.slice(itm[0]-1,itm[1]).sort((a,b)=>a-b);
    newArray.push(sliced[itm[2]-1]);
})
    return newArray
}

참조: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

profile
티끌모아 찐개발자되기

0개의 댓글