아무 원소도 들어있지 않은 빈 배열 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) {
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;
}
reduce를 사용해서 풀어보려다가 gg...
function solution(arr, flag) {
return arr.reduce(
(prev, num, i) => (flag[i] ? [...prev, ...new Array(num * 2).fill(num)] : prev.slice(0, -num)),
[],
);
}
num2개를 어떻게 추가할지 고민하다가 결국 for문을 사용했는데 `new Array(num2)를 통해서 배열의 크기를 만들어주고
.fill(num)`을 통해 그 안을 num으로 채워주는 방식이...! 신기... 이걸 이렇게 할 수 있었군!
slice()
slice() 메서드는 배열의 일부분을 추출하여 새로운 배열을 반환한다.
start인자와 end인자를 받는다.
end인자에 음수가 올경우 배열의 끝부터의 오프셋을 나타낸다.
➡️ prev.slice(0, -num)
은 prev 배열에서 num개의 요소를 제거하여 새로운 배열을 반환하는 것이다.
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]만큼을 제거하고 반환하는 거임.