본문 바로가기
알고리즘/프로그래머스

[ 스택/큐 ] 같은 숫자는 싫어

by 질서정연_ 2023. 7. 3.

 

문제 이름

같은 숫자는 싫어 

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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의 크기 : 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
문제의 예시와 같습니다.

문제 풀기 전 생각

문제 보고 생각 하기 전에 코드를 짰더니 엉망으로 풀었다.

쉬운문제지만 무지성으로 풀지 말자 .. 를 다짐하면서 정리 해 본다. 

 

배열에서 연속적인 숫자를 제거해야한다. 

연속적인 숫자를 제거하려면

 

for 문으로 배열을 모두 돌아서 i+1 원소가 i원소와 다를 때 i번째 원소를 배열에 넣으면 될 것이다.

 

그래서 for문으로 배열을 모두 돌고 i+1원소가 i원소와 다를 때 i 번째 원소를 배열에 넣는 함수를 만들었다.

여기서 내가 궁금했던건 그럼 배열의 마지막 원소는 어떻게 처리 해 줘야 할 것인가? 였다. 

배열의 마지막에 가서 i+1을 하면 접근할 수 없는 범위니까 에러가 나지 않을까? 생각해서 

for 문을 돌면서 배열길이 - 2 인 원소에 도착하면 배열길이 - 1 인거랑 비교해서 같으면 하나만 결과 배열에 넣고 다르면 둘 다 결과 배열에 넣었다.

 

생각을 좀 정리해서 풀어야 할 필요가 있다.

 

우선 처음 푼 코드다 

 

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

다른 사람이 푼 걸 봤더니 filter 로 간결하게 구현한게 있었다. 

filter는 각 요소에 주어진 함수 결과값이 true인 배열을 반환하는 함수다. 

중복 제거 처럼 조건에 맞는 특정 요소만 새 배열에 넣고 싶을 때 사용하면 된다고 한다. 

 여기도 배열의 마지막 요소에서 array[i+1]을 호출하면 오류가 나지 않나 ? 했는데 

 

배열 [ 1, 1, 3, 3, 0 ,1 ,2 ] 이 테스트 케이스를 추가하고 filter함수 추가해서 돌려봤더니 


현재요소:  1  다음 요소:  1
false
현재요소:  1  다음 요소:  3
true
현재요소:  3  다음 요소:  3
false
현재요소:  3  다음 요소:  0
true
현재요소:  0  다음 요소:  1
true
현재요소:  1  다음 요소:  2
true
현재요소:  2  다음 요소:  undefined
true

 

출력하니까 이렇게 나옴 

 

undefinded 이랑 마지막 요소 2가 다르니까 마지막 요소도 배열에 들어가긴 함. 배열 길이 초과하는 index로 배열을 호출하면 에러가 나는 줄 알았는데 ..?  아 리액트에서 나는 에러랑 착각했다 .. ㅎㅎㅎㅎㅎ

새롭게 알게 된 것 , 기억할 것

배열의 길이를 초과하는 원소에 접근하려 하면 undefine 을 반환한다. 

코드 

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

 

 

참조

https://brunch.co.kr/@swimjiy/15

 

JS map, filter, reduce 함수 톺아보기

비슷하지만 다른 세 함수들, 언제 써야 할까? | 보통 배열 내 인자들을 차례로 순회할 때 for문을 많이 사용합니다. 단순하지만 확실한 방법이죠. 하지만 조금만 JavaScript를 살펴보면 for문보다 더

brunch.co.kr

 

댓글