본문 바로가기
기초다지기/JS 코딩테스트

[Lv0] 빈배열 추가 삭제

by 김빵그 2023. 8. 1.

문제

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

 

내 답

function solution(arr, flag) {
 const answer = [];
    for (let i = 0; i < flag.length; i++) {
        if (flag[i]) {
            answer.push(...Array(arr[i]*2).fill(arr[i]));
        } else {
            answer.splice(answer.length - arr[i], arr[i]);
        }
    }
    return answer;
}
  • Array(arr[i]*2) : Array() 생성자 함수 호출하여 새로운 배열은 만든다 여기서 arr[i]*2는 배열의 길이를 나타냄 
  • .fill(arr[i]) : fill()을 사용하여 배열의 모든 요소를 특정값 arr[i]로 채운다
  • ... 스프레드 문법 : [3,3,3,...]을 "3","3","3"으로 펼쳐준다
  • push() : push()를 사용하여 answer배열에 펼쳐진 요소들을 추가
  • answer.length - arr[i] : answer 배열에서 제거할 요소 시작위치 계산. 마지막 요소 인덱스에서 arr[i]를 뺀 인덱스
  • arr[i] : flag[i]가 false일때 제거해야 할 요소의 개수
  • splice() : 배열의 내용을 추가하거나 제거하는 메서드 첫번째 인자는 시작위치, 두번째 인자는 제거할 요소의 개수
  • array.slice(begin, end) : 배열의 시작위치에서 제거할 요소까지 복사본은 새로운 배열 객체로 반환. 원본 배열은 바뀌지 않는다 불변성

그 외의 답 

1) reduce 사용

function solution(arr, flag) {
  return arr.reduce(
    (prev, num, i) => (flag[i] ? [...prev, ...new Array(num * 2).fill(num)] : prev.slice(0, -num)),
    [],
  );
}
  • arr.reduce() : arr의 요소들을 순회하며 새로운 배열 생성. reduce는 배열의 요소를 순회하면서 하나의 값으로 축소하는 데 사용
  • (prev, num , i ) : reduce의 첫번째 인자는 콜백함수로 현재 축적값(prev), 현재요소 (num), 현재 인덱스 (i)를 매개변수로 받는다 
  • 삼항연산자 : flag[i] ? 가 true인 경우와 false인 경우를 구분한다 
  • [...prev, ...new Array(num * 2).fill(num)] : ...prev 이전 축적값 prev 배열을 펼쳐서 모든 요소를 새로운 배열에 추가
  • new Array (num * 2).fill(num) : num값을 num*2개로 채운 새로운 배열 생성 
  • prev.slice(0, -num) : 이전 배열인 prev에서 마지막 num 개의 요소를 제어하는 부분 
  • .[] : reduce() 두번째 인자는 초기 축적값의로 빈 배열을 초기값으로 설정한다

2) for문

function solution(arr, flag) {
    var answer = [];
    for (let i = 0; i < flag.length; i++) {
        if (flag[i]) {
            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;
}
  • for let j ... : true인 경우 arr[i]값의 두배만큼 answer 배열에 추가 push
  • for let k ... : arr[i]값만큼 answer 배열에서 마지막 요소를 제거하는 반복문

 


문재 다른 해답을 보다보면 reduce로 사용해서 푼 문제가 많은데.. 나는 왜인지 익숙하지가 않아 이걸로도 풀수 있을 거 같은데.. 생각만 할뿐 풀어보진 못한다 반성해야지 다음엔 배열 문제에서는 꼭 먼저 생각해서 풀어보려 노력할 것 점점 문제가 어려워지는게 느껴진다.. 이게 레벨 0짜리라니...그만큼 배울것도 많다!! 아좌좢 

'기초다지기 > JS 코딩테스트' 카테고리의 다른 글

[Lv 0] js 해당 인덱스 문자열 지우기  (0) 2023.08.03
배열 순서 위치 변경하기  (0) 2023.08.02
[Lv0] 세로읽기  (0) 2023.07.24
[Lv0] js 팩토리얼  (0) 2023.07.18
[Lv0] 등차수열  (0) 2023.07.17