빈 배열에 추가, 삭제하기
문제 설명
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.
입출력 예
arr | flag | result |
[3, 2, 4, 1, 3] | [true, false, true, false, false] | [3, 3, 3, 3, 4, 4, 4, 4] |
예제 1번에서 X의 변화를 표로 나타내면 다음과 같습니다
i | flag[i] | arr[i] | X |
[] | |||
0 | true | 3 | [3, 3, 3, 3, 3, 3] |
1 | false | 2 | [3, 3, 3, 3] |
2 | true | 4 | [3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4] |
3 | false | 1 | [3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4] |
4 | false | 3 | [3, 3, 3, 3, 4, 4, 4, 4] |
따라서 [3, 3, 3, 3, 4, 4, 4, 4]를 return 합니다.
나의 풀이
function solution(arr, flag) {
let array = [];
for (const i in arr) {
if (flag[i]) array.push(...Array(arr[i] * 2).fill(arr[i]));
if (!flag[i]) array.splice(-arr[i]);
}
return array;
}
몇 번 시행착오가 있던 풀이였다. 일단 처음에 문제를 제대로 이해하지 못해서 `arr[i]`의 "개수"만큼 요소를 추가하거나 삭제한다는 부분을 놓쳤다. 그리고 배열의 요소를 여러 개 추가하거나 삭제하는 방법을 고민하느라 시간이 걸렸다.
처음에는 `array.push()` 매개변수에 `repeat()` 메서드를 이용해서 요소를 반복하려고 했는데 `arr[i]`가 문자열이 아닌 숫자 형태라 풀이가 복잡해질 거 같아서 포기했다. 그리고 아예 배열을 합쳐버리자는 생각에 `concat()` 메서드도 써봤는데 배열이 잘 합쳐지지 않아서 실패했다. 결국에 `Array().fill()`을 이용해서 동일한 요소를 원하는 횟수만큼 반복한 후에 spread operator를 이용해서 배열을 벗긴 후에 `push()` 메서드에 매개변수로 전달하는 방법을 선택했다.
다른 사람의 풀이
function solution(arr, flag) {
return arr.reduce(
(prev, num, i) => (flag[i] ? [...prev, ...new Array(num * 2).fill(num)] : prev.slice(0, -num)),
[],
);
}
기본적으로 나와 비슷한 풀이 방법이지만 for문이 아니라 `reduce()` 메서드를 사용했다는 점이 재미있었다. 그 외에 다른 사람들은 이중 for문을 많이 사용한 거 같다.
'알고리즘 > Programmers' 카테고리의 다른 글
[TIL] 2023.08.15 Programmers_문자열 묶기 (0) | 2023.08.15 |
---|---|
[TIL] 2023.08.14 Programmers_세 개의 구분자 (0) | 2023.08.15 |
[TIL] 2023.08.11 Programmers_날짜 비교하기 (0) | 2023.08.11 |
[TIL] 2023.08.03 Programmers_0 떼기 (0) | 2023.08.03 |
[TIL] 2023.08.02 Programmers_특별한 이차원 배열 2 (0) | 2023.08.02 |
댓글