programmers/level1

[level1] - 같은 숫자는 싫어

태기의삶 2020. 7. 27. 17:20

 

 

 

코딩테스트 연습 - 같은 숫자는 싫어

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

programmers.co.kr

문제 설명 :

배열 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 answer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]

 

접근 방법 :

처음에는 문제를 보고 단순히 중복된 수만 없애면 되겠다 싶어서, new Set()을 이용해서 접근했다.

하지만 단순히 중복된 수를 없애는 것이 아니라, 연속적으로 나타나는 숫자가 하나라도 존재하면 그 숫자 하나만 남겨 놓아야 하고, 그리고 그 본래의 배열의 순서 또한 유지해야만 문제를 해결할 수 있어 다른 접근 방식을 생각해보았다.

그래서 생각해보다가, 배열의 모든 항목들을 하나씩 다 비교해서 앞에 항목과 뒤에 항목이 같지 않을 때, 다른 배열에 그 항목을 push()하는 방법 접근해보았다.

마지막에 i = 6 일 때, arr[i] != arr[i+1] 이 부분에서 배열의 항목 이외의 수를 비교하는데 작동하는 이유는 arr[7]을 undefined로 인식하기 때문에 작동하는 것 같다.

 

내가 짠 코드 :

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

 

다른 사람이 짠 인상 깊은 코드 :

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

정말 간단하게 한 줄로 짜주셨다.

접근 방식은 내가 짠 로직과 같은 원리이다.

간단하게 filter()를 이용해서 모든 항목을 비교해서 같지 않은 수만 새 배열의 형태로 반환한 것이다.

이 생각을 했지만, 로직을 못 짜서 반복문을 썼는데...😂

하지만 오늘도 한 수 배웠기 때문에 기분은 좋았다.