프로그래머스 (JS)/Lv. 1

[Programmers / JS] 12906번 - 같은 숫자는 싫어

hodo- 2023. 3. 17. 09:57

Problem

문제 보기

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.


Solution

첫번째
function solution(arr) {
    let answer = [];
    while (arr.length > 0){
        answer.push(arr.shift());
        if(answer[answer.length-2] === answer[answer.length-1]) answer.pop();
    }
    
    return answer;
}

그동안 항상 정확성 테스트만 나오다가 효율성 테스트도 있어서 당황스러웠다.
위의 코드는 정확성 테스트는 통과했으나 효율성 테스트는 통과하지 못했다..^^..
스택/큐 문제인데 자료구조 공부를 하지 않고 무작정 풀어서 그런가 싶다.

두번째


내가 첫번째에 짠 코드가 효율성 테스트를 통과하지 못한 이유는 배열에 넣고 빼고를 반복해서 비효율적이기 때문인 거 같다..
그래서 배열에 넣기 전에 if~else if 문으로 검열을 하고 조건에 맞는 것만 새배열에 넣는 식으로 forEach문을 사용하여 새로 알고리즘을 짰다.

function solution(arr) {
    let answer = [];
    
    arr.forEach((item, index, a) =>{
        if(index === 0) answer.push(item);
        else if(a[index - 1] !== item) answer.push(item);
    })
    return answer;
}

그랬더니 모두 통과!!
정확성 테스트에서 속도도 빨라졌다


다른 풀이를 보니

function solution(arr) {
    return arr.filter((val,index) => val != arr[index+1]);
}

filter를 이용하면 새로운 배열을 만들 필요도 없이 한줄로 끝낼 수 있다