본문 바로가기

Algorithm/Javascript로 코테 준비하기

[JS로 코테 준비하기] 9. 프로그래머스 - 2차원 바꾸기 (feat. splice)

반응형

https://school.programmers.co.kr/learn/courses/30/lessons/120842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. splice

  • splice는 배열의 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경함
  • splice의 인자: 배열의 변경을 시작할 인덱스(start), 배열에서 제거할 요소의 수(deleteCount), 배열에 추가할 요소(item)
  • spice의 반환값: 제거한 요소를 담은 배열

 

 

2. start만 넘겨준 경우

  • start부터 마지막 요소를 제거
const arr = [1, 2, 3, 4, 5]; //모든 splice 실행 앞에 새로 선언한다고 가정

const deleteAll = arr.splice(0); 
console.log(deleteAll); //[1, 2, 3, 4, 5];
console.log(arr); //[];

const deleteFrom2toFin = arr.splice(2);
console.log(deleteFrom2toFin); //[3, 4, 5];
console.log(arr); //[1, 2];

 

 

 

3. deleteCount를 같이 넘겨준 경우

  • start부터 deleteCount개의 요소를 제거
const arr = [1, 2, 3, 4, 5];

const deleteFrom0to2 = arr.splice(0, 2);
console.log(deleteFrom0to2); //[1, 2];
console.log(arr); //[3, 4, 5];

 

 

4. item도 넘겨준 경우

  • start부터 deleteCount개의 요소를 제거 + 기존 배열의 start위치에 item 추가
const arr = [1, 2, 3, 4, 5]; //모든 splice 실행 앞에 새로 선언한다고 가정

const add6Idx0 = arr.splice(0, 2, 6);
console.log(add6Idx0); //[1, 2];
console.log(arr); //[6, 3, 4, 5];

const add678Idx1 = arr.splice(1, 2, 6, 7, 8);
console.log(add678Idx1); //[2, 3];
console.log(arr); //[1, 6, 7, 8, 4, 5];

 

 

5. 소스 코드의 변천사

splice에 대한 내용의 정리 글이지만, 초기 정답은 이와 거리가 멀었다.

 

문제를 보자마자 아래처럼 풀었기 때문.. (언제쯤 자연스럽게 함수형으로 짤까)

function solution(num_list, n) {
    let answer = [];
    const len = num_list.length / n;
    for(let i = 0; i < len; i++){
        let tmp = [];
        for(let j = 0; j < n; j++){
            tmp.push(num_list[i * n + j]);
        }
        answer.push(tmp);
    }
    return answer;
}

 

1차 수정 POINT

  • splice 활용
//이걸
let tmp = [];
for(let j = 0; j < n; j++){
    tmp.push(num_list[i * n + j]);
}
answer.push(tmp);

//이렇게        
answer.push(num_list.splice(0, n));

 

2차 수정 POINT

  • i의 필요성이 사라져 while로 변경
function solution(num_list, n) {
    let answer = [];
    let len = num_list.length / n;
    while(len--){
        answer.push(num_list.splice(0, n));
    }
    return answer;
}

 

3차 수정 POINT (최종)

  • splice는 원본 배열을 바꾼다는 점 활용 (= num_list의 수가 계속 변경됨을 이용)
function solution(num_list, n) {
    let answer = [];
    while(num_list.length){
        answer.push(num_list.splice(0, n));
    }
    return answer;
}
반응형