문제
아무 원소도 들어있지 않은 빈 배열 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 |