본문 바로가기

코딩테스트

[프로그래머스] level1. 같은 숫자는 싫어 (javascript)

반응형

문제

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

의식의 흐름

  1. set을 써서 겹치는 부분을 없앨라고 했는데, 그러면 1번 케이스처럼 잘못되는 경우가 생김.
  2. 단순하게 for 문을 통해서 겹치는부분 찾기
  3. 처리를 어떻게 할까 하다가
    그냥 지워버리면 for문에서 배열이 밀리는 경우가 생길 것 같아서
    겹치는 부분의 앞부분을 숫자가아닌 것으로 특정문사로 임시로 바꾼 후 , filter를 통해 특정문자인 부분을 없애줬다.

초기코드

function solution(arr)
{
    let answer = [];

    for(let i =0; i < arr.length-1; i++){
        if (arr[i] === arr[i+1]){
            arr[i] = 'a'
        }
    }
    answer = arr.filter((element)=> element !== 'a')

    return answer;
}

다른 사람 정답

방법1.

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

내가 푼거랑 맥랑은 똑같지만, for문을 굳이 따로 돌리지 않고 filter로 합쳤다.
나도 앞으로 filter에서 for문 기능을 하는 것을 잘 이용해 봐야겠다.

 

 

방법2.

function solution(arr) {
    var answer = [arr[0]];

    for (let i=1; i<arr.length; i++) {
        if (answer[answer.length - 1] !== arr[i]) {
            answer.push(arr[i]);
        }
    }

    return answer;
}

배열이 밀리는 것에 대한 해답이 여기 있었다.
배열 첫부분만 따로 미리 넣어두고 push하는 형태로 하면 되는거였다.

반응형