devFancy BE Developer

[Programmers] 131704. 택배상자

2023-10-23
devFancy

문제 링크

성능 요약

  • 메모리: 123 MB, 시간: 33.14 ms

구분

  • 코딩테스트 연습 > 스택, 구현

Answer Code1(23.10.23)

import java.util.*;

/**
 * main_con : 메인 컨테이너
 * sub_con : 서브 컨테이너
 * 주문 갯수만큼 for 문 돌리면서
 * 1) 현재 순서와 맞는 택배 상자가 올때까지 서브 컨테이너 벨트에 저장한다.
 * 1-1) 메인 컨테이너의 현재 위치에 있는 값과 일치하면 break;
 * 1-2) 서브 컨테이너가 비어있지 않고, 서브 컨테이너의 현재 위치에 있는 값과 일치하면 break;
 * 1-3) 메인, 서브에 있는 값과 일치하지 않으면 1 증가시켜 1-1로 되돌아간다.
 * 2) 서브 컨테이너(Stack)에 다 저장되었으면 탐색 시작한다.
 * 2-1) 메인 컨테이너의 현재 위치에 있는 값과 일치하면 정답 갯수 +1 증가
 * 2-2) 서브 컨테이너가 비어있지 않고, 서브 컨테이너의 현재 위치에 있는 값과 일치하면 서브 컨테이너 pop()하고 정답 갯수 + 1 증가
 * 2-3) 메인, 서브에 있는 값과 일치하지 않으면 종료
 */

class Solution {
    public int solution(int[] order) {
        int answer = 0;
        int main_con = 1;
        Stack<Integer> sub_con = new Stack<>();
        for(int o : order) {
            while(main_con <= order.length) { // 1
                if(main_con == o) break; // 1-1
                else if(!sub_con.isEmpty() && sub_con.peek() == o) // 1-2
                    break;
                else { // 1-3
                    sub_con.push(main_con);
                    main_con++;
                }
            }

            // 2
            if(main_con == o) { // 2-1
                answer++;
                main_con++;
            } else if(!sub_con.isEmpty() && sub_con.peek() == o) // 2-2
            {
                sub_con.pop();
                answer++;
            } else // 2-3
            {
                break;
            }
        }
        return answer;
    }
}

문제 풀이

  • 해당 문제는 두개의 컨테이너 벨트가 존재한다.

  • 메인 컨테이너는 택배박스를 트럭에 싣기 전에 1부터 n까지 순서대로 놓여져 있는 메인 컨테이너 벨트이고,

  • 서브 컨테이너는 순서에 맞지 않는 택배박스를 임시로 놓는 서브 컨테이너 벨드이다.

  • 해당 문제에서 우리는 주어진 순서에 해당하는 택배 박스를 메인 또는 서브 컨테이너 벨트에 있는지 확인하고, 이것을 트럭에 싣는 것이다.

  • 만약에 메인 컨테이너에 없다면 -> 서브 컨테이너 벨트의 맨 앞의 상자를 확인하고 -> 서브 컨테이너에도 없다면 택배 상자를 서브 컨테이너 벨트에 보관하고, 메인 컨테이너 벨트에서 다음 택배 상자를 확인한다.

할 일을 정리해보면 다음과 같다.

  1. 정해진 순서에 따른 택배 박스를 확인한다. -> 반복문 이용
  2. 메인 컨테이너에 있는 상자가 현재 배달하는 순서와 같으면 트럭에 실고
  3. 그게 아니라면, 서브 컨테이너에 있는 상자를 확인한다.
  4. 서브 컨테이너에 있는 상자가 현재 배달하는 순서와 같으면 트럭에 실고
  5. 그게 아니라면, 다음 택배 상자를 확인한다.
  6. 만약 메인 컨테이너와 서브 컨테이너 벨트의 맨 앞에 있는 상자와 순서가 다르면 종료한다.

Review

  • 문제를 이해하는데 시간을 오래 잡아먹었지만, 이해하기에는 크게 어려움이 없었다.
  • 다만, 반복문을 어딴 기준을 세우고 해야 할지 감을 잡기 어려웠고, 그래서 그림을 그려서 이해하도록 노력했다.
  • 스택의 문법과 구현에 대한 과정을 알 수 있어서 좋은 문제라고 생각한다.

Reference


Comments

Index