[프로그래머스] K번째수

Jun_Gyu·2023년 8월 5일
0

프로그래머스

목록 보기
4/14
post-thumbnail


첫 풀이

처음에는 먼저 입력받는 매개변수 array에서 매개변수 commands의 각 배열 요소들의
인덱스 0번~1번에 해당하는 구간을 .slice()메소드를 통해 떼어내준 뒤,

.sort() 메소드를 활용하여 떼어낸 요소들을 오름차순으로 정렬한 후, 해당 배열 요소에서 매개변수 commands의 인덱스 2번 숫자에 해당하는 요소를 추출하여 answer라는 배열에 차례대로 하나씩 넣어주는 방법을 사용하여 문제를 풀었다.


먼저 맨 초반에 작성한 풀이이다.

const solution = (array, commands) => {
  let first = array  // 첫번째 인덱스
  	// 1. 매개변수 commands의 0번째~ 1번째 수의 구간만큼 새로운 배열 생성
    .slice(commands[0][0] - 1, commands[0][1]) 
    // 2. 생성된 배열을 오름차순 정렬 후 commands의 2번째 인덱스 수에 해당하는 인덴스값 추출, 변수 first에 할당.
    .sort((a, b) => a - b)[commands[0][2] - 1];
  // 2번 더 반복
  let second = array // 두번째 인덱스
    .slice(commands[1][0] - 1, commands[1][1])
    .sort((a, b) => a - b)[commands[1][2] - 1];
  let third = array  // 세번째 인덱스
    .slice(commands[2][0] - 1, commands[2][1])
    .sort((a, b) => a - b)[commands[2][2] - 1];
  
  console.log([first, second, third]); // 추출된 값을 차례대로 배열로 지정 및 출력.
};

직관적으로 나타내기 위해서 초반에는 first, second,third라는 변수를 할당하여 함수 자체가 정상적으로 동작하는지 확인해보았다.

...??? 뭐지 출력 나오는데 왜 undefined인가..


이게 무슨 일인가 싶어 혹시나 하는 마음에

 console.log([first, second, third]);

해당 코드를 console.log()가 아닌 return 키워드로 변경하여 값을 반환하도록 해보았다.

역시 예상이 맞았다...

하나에 문제를, 둘에 똑바로 읽자


어쨋거나 문제는 해결했지만, 코드에서 반복되는 요소가 많아 반복문을 사용하여 코드의 길이를 한번 줄여보도록 하겠다.

// 기존 작성했던 solution함수.

const solution = (array, commands) => {
  let first = array  // 첫번째 인덱스
  	// 1. 매개변수 commands의 0번째~ 1번째 수의 구간만큼 새로운 배열 생성
    .slice(commands[0][0] - 1, commands[0][1]) 
    // 2. 생성된 배열을 오름차순 정렬 후 commands의 세번째 인덱스 수에 해당하는 인덴스값 추출, 변수 first에 할당.
    .sort((a, b) => a - b)[commands[0][2] - 1];
  // 2번 더 반복
  let second = array // 두번째 인덱스
    .slice(commands[1][0] - 1, commands[1][1])
    .sort((a, b) => a - b)[commands[1][2] - 1];
  let third = array  // 세번째 인덱스
    .slice(commands[2][0] - 1, commands[2][1])
    .sort((a, b) => a - b)[commands[2][2] - 1];
  
  return [first, second, third]; // 추출된 값을 차례대로 배열로 지정 및 출력.
};

/* =================================================================================== */

// 같은 기능을 수행하는 좀 더 짧은 코드. 

const solution = (array, commands) => {
  let answer = []; // return할 answer변수에 빈 배열 할당.
  for (let i = 0; i < commands.length; i++) {
    answer.push(array // answer[i] = array~ 와 같은 역할 수행!
      .slice(commands[i][0] - 1, commands[i][1]) 
      .sort((a, b) => a - b)[commands[i][2] - 1]);
  }
  return answer;
};

저번보다도 더 다양한 메소드 기능을 활용하여 문제를 해결했다!

풀이 개선

내가 실행한 풀이에서 보면 .slice()메소드 안에서 매개변수commands의 배열 요소를 활용하기 위하여 commands[i][0] - 1, commands[i][1] 와 같이 코드를 구성했는데, commands 배열의 각 요소를 .map() 메소드로 변환하여 처리할 수 있다.

const solution = (array, commands) => {
  return commands.map(command => {  // map 메소드를 활용, commands의 배열 각 요소를 변환하여 처리.
    const [start, end, k] = command;  // command로 받은 배열의 각 인덱스값을 변수에 할당.
    const slicedArray = array.slice(start - 1, end);  // array에서 해당 구간 배열을 추출.
    const sortedArray = slicedArray.sort((a, b) => a - b);  // 오름차순 정렬하여 저장.
    return sortedArray[k - 1]; // 정렬된 값에서 인덱스번호 (K - 1)의 값을 리턴.
  });
};
profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글