[Lv2] 택배상자

이말감·2022년 11월 13일
0

Programmers

목록 보기
31/32

문제

링크

풀이

프로그래머스 택배 상자 javascript 글을 참고하여 문제를 해결할 수 있었습니다.

function solution(order) {
    const belt = [];
    let index = 0;
    for (let i=1; i < order.length + 1; i++) {
        belt.push(i);
        while (belt.length > 0 && order[index] === belt[belt.length-1]) {
            belt.pop();
            index++;
        }
    }
    return index;
}

처음에 문제를 이해하지 못해서 질문하기 부분에서 다른 사람들이 설명해주는 글을 보고 이해할 수 있었다.

1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다.

  • 박스가 1, 2, 3, 4, ... , n 이렇게 영재에게 전달된다는 말이다.

택배 기사님이 미리 알려준 순서에 맞게 영재가 택배상자를 실어야 합니다.

  • 위와 같은 순서로 나열된 박스를 order에 적힌 순서대로 실어야 한다는 말이다.

이렇게 문제를 이해한 후, 내 나름대로 문제를 해석하여 풀기 시작했다.

order[0]과 box가 같은지, 같다면 트럭에 싣고 order[0]과 belt[-1]과 같은지 확인하기 ...
이런 과정으로 이해하고 코드를 작성했지만, 아무리해도 답은 안나왔다.
그래서 결국 다른 분의 코드를 살펴본 후 문제를 해결할 수 있었다.

위 코드는 다음과 같이 이해할 수 있다.

  1. for 문 사용하기

문제에서 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다. 라고 했기 때문에 굳이 새로운 배열을 만들어 주지 않고 for문을 통해 1부터 order.length+1까지 반복하면 된다.

  1. index 사용하기

order는 0번째 원소부터 하나씩 비교해 나가기 때문에 같다면 빼주고, 또 0번째 원소와 박스를 비교할 필요가 없다.
index 값을 0으로 먼저 설정해주고, 만약 box 값과 order[index]값이 같다면 index 값만 1씩 증가시키면 되는 것이다.

그러니까 문제에서 택배 기사님이 원하는 상자 순서를 나타내는 정수 배열 order가 주어졌을 때, 영재가 몇 개의 상자를 실을 수 있는지 를 물어보고 있기 때문에 1씩 증가하는 index 값이 즉, 문제에서 요구하는 리턴 값이라는 것을 알 수 있다.

  1. stack에 넣기

belt.push(i);
먼저 i 값을 belt라는 스택에 넣는다.
그리고 belt에 값이 있고, 어차피 가장 마지막 값이 방금 넣은 i 값이기 때문에
스택 belt의 마지막 값과 order[0]을 비교한다.

while (belt.length > 0 && order[index] === belt[belt.length-1])

같을 경우, belt.pop()으로 belt에서 다시 그 i 값을 빼주고
index++으로 order[index] 박스가 트럭에 올라갔기 때문에 index도 1 증가하여 다음에 order[index+1] 값과 비교할 수 있도록 한다.
이때 while문을 돌리는 이유는 그 다음 belt 값과 order[index] 값이 같다면 pop하여 트럭에 실어주면 되기 때문이다.

다를 경우, while문이 돌아가지 않고 다음 숫자인 i+1부터 다시 진행된다.


문제의 코드만 보면 정말 간단한 문제인데 내가 너무 빙빙 돌아서 문제를 이해했나보다.
추후에 다시 문제를 풀어봐야 내가 이해했는지 알 수 있을 거 같다.
꼬옥 다시 풀기 !!!!!!!!!!!!!!

profile
전 척척학사지만 말하는 감자에요

0개의 댓글