[js] 빈 배열에 추가, 삭제하기

sookyoung.k·2024년 7월 2일
1
post-thumbnail

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

제한사항

  • 1 ≤ arr의 길이 = flag의 길이 ≤ 100
  • arr의 모든 원소는 1 이상 9 이하의 정수입니다.
  • 현재 X의 길이보다 더 많은 원소를 빼는 입력은 주어지지 않습니다.

나의 풀이

function solution(arr, flag) {
    let answer = [];
    flag.forEach((v, i) => {
        if(v === true) {
            for (let j=0; j < arr[i] * 2; j++) {
                answer.push(arr[i])
            }
        } else {
            for (let k=0; k < arr[i]; k++)
                answer.pop()
        }
    })
    return answer;
}
  1. 정답을 담을 빈 배열 answer을 선언한다.
  2. flag를 forEach() 메서드를 통해 순회한다.
    • 값이 true일 경우 for문을 통해 arr[i] * 2개 만큼 arr[i]를 answer 배열에 추가한다.
    • 값이 false일 경우 반대로 arr[i]개 만큼 answer함수에서 마지막 값을 제거한다.
  3. 값을 반환한다.

reduce를 사용해서 풀어보려다가 gg...

다른 풀이 1

function solution(arr, flag) {
  return arr.reduce(
    (prev, num, i) => (flag[i] ? [...prev, ...new Array(num * 2).fill(num)] : prev.slice(0, -num)),
    [],
  );
}
  1. arr 함수를 reduce() 메서드를 통해 순회하며 새로운 배열을 생성한다.
    • 초기값 [], prev: 이전 상태 배열, num: 현재 요소, i: 현재 인덱스
  2. flag[i]가 참일 경우 num * 2 개수만큼 prev 배열에 추가한다.
  3. flag[i]가 거짓일 경우 prev 배열의 끝에서 num 개수만큼 제거한다.

num2개를 어떻게 추가할지 고민하다가 결국 for문을 사용했는데 `new Array(num2)를 통해서 배열의 크기를 만들어주고 .fill(num)`을 통해 그 안을 num으로 채워주는 방식이...! 신기... 이걸 이렇게 할 수 있었군!

slice()

slice() 메서드는 배열의 일부분을 추출하여 새로운 배열을 반환한다.
start인자와 end인자를 받는다.
end인자에 음수가 올경우 배열의 끝부터의 오프셋을 나타낸다.
➡️ prev.slice(0, -num)은 prev 배열에서 num개의 요소를 제거하여 새로운 배열을 반환하는 것이다.

다른 풀이 2

function solution(arr, flag) {
    var answer = [];

    for(let i = 0; i<arr.length; i++){
        if(flag[i]){
            for(let j = 0; j<arr[i]*2; j++){
                answer.push(arr[i])
            }
        }
        else{
           answer = answer.splice(0,answer.length-arr[i])
        }
    }

    return answer;
}

참일 경우는 비슷한 것 같으니 설명하지 않고...

배열의 끝에서 arr[i]개의 요소를 제거하는 것이 answer = answer.splice(0,answer.length-arr[i]) 요런 식으로 쓰였는데!

splice() 메서드는 원본 배열을 변경하고, 제거된 요소들을 반환한다. 따라서 answer이 제거된 후의 배열로 업데이트 된다. arr[i]만큼을 제거하고 반환하는 거임.

profile
영차영차 😎

0개의 댓글

Powered by GraphCDN, the GraphQL CDN