한 걸음씩

[프로그래머스][JS] 배열 만들기 6 본문

Programmers

[프로그래머스][JS] 배열 만들기 6

winter17 2023. 6. 13. 21:59

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

 

프로그래머스

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

programmers.co.kr

풀이 과정

function solution(arr) {
    var stk = [];
    let i = 0
    while(i < arr.length){
        if (stk.length === 0){
            stk.push(arr[i])
            i++
        }else if (stk.length > 0){
            if (stk[stk.length - 1] === arr[i]){
                stk.pop()
                i++
            }else{
                stk.push(arr[i])
                i++
            }
        }
    }
    if (stk.length === 0){
        return [-1]
    }
    return stk;
}

이 문제는 코드를 설명할 필요 없는데 문제를 읽으면서 바로 코드로 옮겼다고 말하는 게 맞을 것 같다.

문제 초반에 'i가 arr의 길이보다 작으면 다음을 반복합니다'라는 부분은 반복을 얼마나 해야 하는지 모르기 때문에 while을 사용하고

나머지는 조건문으로 나눠주면 되는데 원소를 추가하거나 제거하는 부분에서는 pop, push를 사용하면 된다. 엄청 쉬운 스택문제?!

마지막에 빈 배열인 경우에 [-1]을 리턴해야 하는 조건만 잘 처리하면 무리 없이 통과될 거다 

 

마지막 원소를 꺼내는 부분에서 stk.slice(-1)stk[stk.length - 1]에 대해 헷갈렸는데

stk.slice(-1)는 배열의 마지막 요소를 배열로 반환한다. 예를 들어 배열이 [1, 2, 3, 4] 일 때, 마지막 요소를 slice메서드로 찾으면 [4]를 반환하게 되는 것이다.

반면에 stk [stk.length - 1]는 배열의 마지막 요소를 반환한다. 배열의 마지막 요소가 4이면 4를 반환하는 것이다.

따라서 이 문제에서는 arr [i]과 비교해야 하므로 length를 사용하는 게 더 적절하다


리뷰

반복문, 조건문, 스택에 대한 이해가 있다면 쉽게 풀 수 있는 문제였다