TIL_250407

듀듀·2025년 4월 7일

spring_TIL

목록 보기
36/53

택배상자

링크텍스트

문제 설명

  1. 1,2,3....순으로 들어오는 상자를 order에 나와있는 순으로 트럭에 싣는다.
  2. 현재 순서가 아닌 상자는 보조 컨테이너(stack)에 실어넣고 해당 순서가 돌아오면 트럭에 싣는다.
    만약 1번 상자가 트럭에 실려야 하는데 현재 상자와 보조 컨테이너의 맨 위의 상자 모두 1번 상자가 아니라면 더 이상 트럭에 상자를 싣지 못한다.
  3. 트럭에 실린 상자 갯수 return

풀이 방법 및 시행착오

처음 풀 때는 아예 문제 이해를 잘못했었다.
그래서 보조 컨테이너 stack에 order을 넣고 있었다.
그러다 문제 다시 읽어보고 틀린 거 파악함
실제 시험이였으면 이 문제는........... 따흑

암튼 보조 컨테이너 stack에 현재 들어오고 있는 박스를 넣는 풀이 방식으로 풀었다. 그러나~ 두둥!

실패코드

import java.util.*;
class Solution {
    public int solution(int[] order) {
        int answer = 0;
        
        //보조 컨테이너 벨트
        Stack<Integer> stack = new Stack<>();
        
        //트럭에 담겨야 할 박스
        int i = 0;
        //현재 박스
        int box = 1;
        while(box<=order.length) {
            //트럭에 들어가야 하는 박스
            int truck = order[i];
            
            //현재 들어온 박스가 트럭에 실을 수 있다면
            if(box == truck) {
                box++;
                i++;
                answer++;
            }
            //보조 컨테이너에 있다면
            else if(!stack.isEmpty() && stack.peek() == truck) {
                while(stack.peek() == truck) {
                    stack.pop();
                    i++;
                    answer++;
                }
            }
            //트럭에 실을 수 없다면 
            else {
                stack.push(box);
                box++;
            }
        }
        return answer;
    }
}

결과

테스트 1
입력값 〉	[4, 3, 1, 2, 5]
기댓값 〉	2
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	[5, 4, 3, 2, 1]
기댓값 〉	5
실행 결과 〉	실행한 결괏값 1이 기댓값 5과 다릅니다.
테스트 결과 (~˘▾˘)~
2개 중 1개 성공

틀리니깐 (~˘▾˘)~ <- 이 표정도 좀 열받음

예시 보면서 풀었는데 왜 틀렸쥐,, 생각하면서 연습장에 슥슥 풀어보니 예시2에서 보조 컨테이너 벨트에 상자 실컷 다 쌓아놓고 while문이 끝나버려서 트럭에 싣지 않고 끝나버렸다 띠용!

그래서~ 보조 컨테이너 스택에서도 순서에 맞는 상자가 오면 트럭에 싣는 코드를 추가해줬다.

정답 풀이 방법

  1. 보조 컨테이너 벨트를 stack으로 만든다.
  2. 트럭에 담겨야 할 박스(i)와 현재 박스(box)에 대한 변수를 설정한다.
    2-1. 이때, 트럭에 담겨야 할 박스는 order[i]이다.
  3. 들어오는 박스가 박스들의 길이보다 짧거나 같을 동안 반복해준다.
    3-1. 같을 동안이 들어가는 이유: 난 현재 박스를 1로 시작했기 때문에
  4. 현재 들어온 박스가(box) 트럭에 담겨야 할 박스와 같다면 다음 박스(box++) 받고 order에서도 다음 박스로(i++) 넘어간다.
  5. 보조 컨테이너(stack)에 있다면 while문을 써서 stack이 비어있지 않고 stack.pop과 트럭에 담아야 할 박스가 같다면 트럭에 실어준다.
  6. 트럭에 실을 수 없다면 보조 컨테이너에 담아준다.
  7. 들어오는 박스는 끝났어도 보조 컨테이너에 아직 트럭에 담을 수 있는 박스가 존재할 수 있으므로 똑같은 방식으로 트럭에 담아준다.

정답 코드

import java.util.*;
class Solution {
    public int solution(int[] order) {
        int answer = 0;
        
        //보조 컨테이너 벨트
        Stack<Integer> stack = new Stack<>();
        
        //트럭에 담겨야 할 박스
        int i = 0;
        //현재 박스
        int box = 1;
        while(box<=order.length) {
            //트럭에 들어가야 하는 박스
            int truck = order[i];
            
            //현재 들어온 박스가 트럭에 실을 수 있다면
            if(box == truck) {
                box++;
                i++;
                answer++;
            }
            //보조 컨테이너에 있다면
            else if(!stack.isEmpty() && stack.peek() == truck) {
                while(!stack.isEmpty() && stack.peek() == truck) {
                    stack.pop();
                    i++;
                    answer++;
                }
            }
            //트럭에 실을 수 없다면 
            else {
                stack.push(box);
                box++;
            }
        }
        
        //박스 다 넣은 뒤에도 보조 컨테이너에 실을 수 있는 게 있을 수 있음
        while (!stack.isEmpty() && stack.peek() == order[i]) {
            stack.pop();
            i++;
            answer++;
        }
        
        return answer;
    }
}

정답!
쉬워보였는데 빡셌다


지금 보니 같은 코드가 반복되네...? 진짜 가독성 빵점이자너 (~˘▾˘)~
하지만 이 방법 말고는 떠오른 게 없었다. 다른 사람들 풀이 염탐 좀 해야쓰겄다.
가독성있게 코드 줄이는 방법도 공부해야겠다. 떼잉

0개의 댓글