프로그래머스 - 같은 숫자는 싫어(Javascript)

김승민·2023년 1월 6일

알고리즘

목록 보기
5/5
post-thumbnail

서론

최근 월간 코드챌린지, 카카오 인턴 등 기출 문제들을 주로 풀었다.
근데 스택/큐를 사용하는 문제에서 유독 애를 먹는 내 모습을 발견했다.
그래서 프로그래머스 고득점 kit을 유형별로 하나씩 풀고있는데,
이 문제를 풀고나서 다른 사람의 풀이도 보니 신기한 점들이 있어서,
추후에 내가 볼 수 있도록 포스팅 해두기로 했다.

문제

[level 1] 같은 숫자는 싫어 - 12906

문제 링크

성능 요약

메모리: 93.8 MB, 시간: 32.39 ms

구분

코딩테스트 연습 > 스택/큐

채점결과


정확성: 71.9
효율성: 28.1
합계: 100.0 / 100.0

문제 설명

배열 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 함수를 완성해 주세요.

제한사항
  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예
arr answer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]
입출력 예 설명

입출력 예 #1,2
문제의 예시와 같습니다.

풀이과정

첫 제출코드

function solution(arr)
{
    var answer = [];
    var stack=[];
    for (var element of arr )
    {
        if(stack.length === 0)
        {
            answer.push(element);
            stack.push(element);
        }
        else
        {
            if(stack[0] === element) continue;
            else
            {
                stack.pop()
                stack.push(element)
                answer.push(element)
            }
        }
        
    }

    return answer;
}

이게 첫 제출코드인데, 아래와 같은 생각을 하며 풀이했다.

  1. stack을 하나 생성하고 입력을 순회한다.
  2. 만약에 스택이 비어있다면, return될 값과 스택에 push해준다.
  3. 그 외에는 스택의 첫 요소와 비교한 뒤, 같은 경우 continue
    다른 경우에는 스택을 비운 뒤 새로운 값으로 채워준다.
    그리고 return값에도 마찬가지로 채워준다.

아무튼, 정답이긴 했다. 근데 다른 풀이들이 궁금해서 좀 찾아봤는데
filter()를 활용하는게 모범 답안인듯 하더라.
어떻게 하냐면..

최종 제출코드

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


더 줄이면..

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

??????????
일단, filter는 정한 조건에 대해서 참이면 이를 return하고,
조건을 충족하지 못하는 경우에는 버려버린다.
filter의 파라미터로 해당 배열의 값 뿐만 아니라 index도 사용할 수 있다.
필터의 존재에 대해서 알았지만, 마땅한 방법이 떠오르지 않아서
아까 맨 위 코드처럼 풀이한 것인데.. index 를 활용하면 저렇게 쉽게 풀수있다..!
입력값인 arr를 val로 순회하며, val이 arr[index+1](즉, 다음 value) 와 다른 경우에만 반환하는 것이다.
사실 어려운 문제도 아니고 풀이가 복잡하거나 조건이 까다롭지도 않았지만,
아는 만큼 더 효율적으로 코드를 작성할 수 있겠다 싶어서 포스팅했다.
오늘도 하나 배워간다.

0개의 댓글