한 걸음씩

[프로그래머스][JS] 빈 배열에 추가, 삭제하기 ✅ 본문

Programmers

[프로그래머스][JS] 빈 배열에 추가, 삭제하기 ✅

winter17 2023. 6. 9. 11:38

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

 

프로그래머스

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

programmers.co.kr

풀이 과정

function solution(arr, flag) {
    var answer = [];
    for (let i = 0; i < flag.length; i++){
        if (flag[i] === true){
            answer.push(...Array(arr[i]).fill(arr[i]))
            answer.push(...Array(arr[i]).fill(arr[i]))
        }else{ // false
            answer.splice(-arr[i]) // 마지막 arr[i]개의 원소 제거
        }
    }
    return answer;
}

 

[상세 설명]

answer.push(...Array(arr[i]).fill(arr[i]))
answer.push(...Array(arr[i]).fill(arr[i]))

// push를 두 번을 했는데 아래처럼 수정할 수 있다.
 answer.push(...Array(arr[i] * 2).fill(arr[i]))
 // Array(arr[i] * 2) 배열의 길이를 두 배로 늘려서 push를 두 번하지 않도록 하기

true일 때, push를 두 번 하는 이유는 문제에서 arr[i] * 2번 추가하라고 했기 때문이다.

 

Array(arr[i]).fill(arr[i]) 

arr[i] = 3일 때, Array(3).fill(3) → 배열의 길이가 3이고 모든 요소를 3으로 채워라 : [3, 3, 3]

그런데 초기에 answer이라는 배열을 생성했고 이 배열에 push 하면서 false가 나왔을 때 원소를 빼야 하니까 위의 코드에서 스프레드를 해줘야 이차원 배열이 안된다. 스프레드를 하지 않고 push를 하면 [[3, 3, 3]]의 결과를 얻게 된다.

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

 

Array() 생성자 - JavaScript | MDN

Array() 생성자는 새로운 Array 객체를 생성할 때 사용합니다.

developer.mozilla.org

 

answer.splice(-arr[i]) // 마지막 arr[i]개의 원소 제거

arr[i]에서 음수를 붙여준 이유는 마지막에서 arr[i]개를 제거해야 하기 때문이다.

splice는 해당 인덱스를 포함해서 이후의 모든 요소를 제거한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

 

Array.prototype.splice() - JavaScript | MDN

splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.

developer.mozilla.org


리뷰

배열을 생성하는 방법은 써본 적이 없었는데 이 문제를 통해서 새롭게 배웠다.

splice 메서드는 꽤 자주 사용하는데 매번 문서를 찾아보는 것 같다...