본문 바로가기
알고리즘/Programmers

[TIL] 2023.08.13 Programmers_빈 배열에 추가, 삭제하기

by heereal 2023. 8. 13.

빈 배열에 추가, 삭제하기

문제 설명

아무 원소도 들어있지 않은 빈 배열 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문을 많이 사용한 거 같다.

 

 

댓글