관리 메뉴

개발 여행자, 현

[프로그래머스/JavaScript] K번째 수 (feat. 나의 첫번째 알고리즘 문제) 본문

알고리즘

[프로그래머스/JavaScript] K번째 수 (feat. 나의 첫번째 알고리즘 문제)

예스현 2021. 10. 16. 21:05

문제설명

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

입출력 예시


최초풀이

function solution(array, commands) {
  var answer = [];
  for (var i = 0; i < commands.length; i++) {
    var fin = [];
    var a = commands[i][0];
    var b = commands[i][1];
    var c = commands[i][2];
    fin = array.slice(a - 1, b).sort();
    answer.push(fin[c - 1]);
  }

  return answer;
}

문제를 한 줄씩 읽어나갈 때 마다 떠오르는 함수들이 있었다

특정 부분을 가져올 때는 slice, 정렬할 때는 sort, 배열에 이어 붙일 때는 push

그래서 꽤 쉬울거라는 생각을 가졌지만, 생각보다 오래걸렸던 것 같다. 

처음 풀어보는 알고리즘 문제여서 그럴지도 모르지만!

 

반복문을 사용해야겠다 생각이 들어서 for문을 사용했다

fin이라는 빈배열을 만들고, 추출되는 요소들을 하나씩 push했다.

이중배열 문제여서 값을 어떻게 가져오는지 헷갈려서 고민을 했던 것 같다

 

slice는 문제에서 3번째 값을 가져오라고 했는데, 배열은 0부터 시작하므로 -1을 해주었다.

그 결과 

잘 되는 줄 알았지만?!

테스트2에서 오류가 발생했다.

오류발생 !

&nbsp;

검색해본 결과 sort()는 문자열을 정렬할 때 쓰는 함수라고 한다.

. MDN의 sort 문서를 보시면 숫자배열의 경우 다음과 같이 정렬된다. [1, 30, 4, 21, 100000] -> [1, 100000, 21, 30, 4]. 결국 숫자들을 오름차순으로 정렬하기 위해선 sort((a,b) => a - b) 로 작성해주어야 한다.

최종풀이

function solution(array, commands) {
  var answer = [];
  for (var i = 0; i < commands.length; i++) {
    var fin = [];
    var a = commands[i][0];
    var b = commands[i][1];
    var c = commands[i][2];
    fin = array.slice(a - 1, b).sort((a,b) => a - b);
    answer.push(fin[c - 1]);
  }

  return answer;
}

짝짝짝~ 이렇게해서 나의 첫 번째 알고리즘 문제 해결! 

다른 분들의 예시를 보면서 하나씩 더 배워나가고 있다 :)

 


학습한 개념

array.length : 리스트 요소수 반환
array.splice("시작위치", "제거건수") : 원하는 위치에서 하나 이상의 요소를 제거

array.splice("시작위치", "제거건수", ["요소1", "요소2" ... ]) : 원하는 위치에서 요소 제거후 새로운 요소 추가

array.push("") : 배열의 끝에 요소를 추가

array.unshift("") : 배열의 앞쪽에 요소를 추가

array.pop() : 배열의 마지막 요소 제거 (반환가능)

array.shift() : 배열의 첫번쨰 요소 제거 (반환가능)

array[ ][ ] : 이중배열 요소 가져오기

array.slice() : 시작위치부터 끝 위치 전까지 복사본을 새로운 배열 객체로 반환 ( 즉, 원본 배열은 수정되지 않음 ) 

array.sort() : 리스트 정렬