Algorithm - lev1 K번째수

ryan·2022년 5월 22일
0

프로그래머스 lev1 K번째 수

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수 구하기

내 풀이 (85/100)

function solution(array, commands) {
  const answer = [];
  commands.forEach((e) => {
    let a = array.slice(e[0] - 1, e[1]).sort();
    answer.push(a[e[2] - 1]);
  });
  return answer;
}
  • forEach를 이용하여, 2차원 배열로 주어지는 commands의 각 요소를 추출하여 array 매개변수에 로직을 적용하는 방식을 택했다.
  • 처음에 slice가 아닌 splice로 하다가 splice가 기존 배열을 변환하는 것을 인지하고 새로운 배열을 생성하는 slice로 바꿨는데, slice의 기본 문법을 splice와 동일하게 사용하는 실수를 했다. 내가 사용하는 메서드가 만들어진 본래의 의도를 의식할 필요가 있다.
  • 테스트 케이스 하나가 계속해서 틀렸다. 내 로직을 계속해서 살펴봤는데, 내 눈에는 예외를 찾을 수 없어 다른 사람의 풀이를 확인해봤다.

slice, splice

  • slice : slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환
arr.slice([begin[, end]])
  • splice : splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

다른 사람 풀이

function solution(array, commands) {
  return commands.map((cmd) => {
    const arrCmd = array
        .slice(cmd[0] - 1, cmd[1])
        .sort((a, b) => a - b);
    return arrCmd[cmd[2] - 1];
  });
}
  • 정답 배열을 추출하는 로직은 동일하지만 forEach가 아닌 map을 사용했다는 것을 알 수 있다. 위에서 내가 실수했던 splice, slice의 사용과 비슷한 맥락인데 forEach는 배열에 대한 반복문을 대체하기 위한 메서드이고, map은 배열을 특정 조건을 적용한 새로운 배열을 반환시키기 위해 사용하는 메서드이다.
  • 이번 문제는 기존 배열에 조건을 적용하여 새로운 배열을 반환시키는 문제였다. map을 통해 forEach에서 push하는 과정을 없애고 더 효율적으로 본 의도에 맞게 메서드를 사용해야 했다.
profile
프론트엔드 개발자

0개의 댓글