본문 바로가기

알고리즘(w.KOTLIN)/자료구조

[알고리즘][KOTLIN] 택배상자

728x90

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. 트럭에 실는 상자를 저장하는 result list 를 선언한다. result 의 크기가 결과로 도출 된다.

2. 메인/보조 컨테이너 벨트를 나타내는 Stack 을 선언한다. 이때 메인 컨테이너 벨트를 order 의 크기 만큼 내림 차순으로 실어야 할 상자를 Stack 에 저장한다.

3. order 배열의 index 를 0으로 선언하고 while 문을 통해서 조건을 탐색 한다.

    3-1. index 가 order 의 크기와 같으면 상자를 모두 탐색했으므로 while 문을 종료 한다.

    3-2. 메인 컨테이너 Stack 이 비어 있다면 보조 컨테이너 Stack을 탐색한다. 현재 실어야 할 상자와 order 의 상자 순서가 같지 않으면  더이상 트럭에 상자를 실을 수 없으므로 while 문을 종료한다. 같으면 result list 에 저장하고 index 를 증가한다.

    3-3. 메인 컨테이너 Stack 에 상자가 있다면 메인 컨테이너의 상자와 order 의 상자가 같은 지 확인하여 같으면 result list 에 저장하고 index 를 증가한다. 같지 않으면 메인 컨테이너의 상자를 보조 컨테이너 Stack 에 저장한다.

코드

import java.util.*

class Solution {
    fun solution(order: IntArray): Int {
        // 트럭에 실은 상자 리스트
        val result = mutableListOf<Int>()
        
        // 컨테이너 벨트
        val main = Stack<Int>()
        // 보조 컨테이너 벨트
        val sub = Stack<Int>()
        
        for (i in order.size downTo 1) {
            main.add(i)
        }
        
        var index = 0
        
        while (true) {
            // index가 order 의 크기와 같으면 다 탐색했으므로 종료 한다.
            if (index == order.size) break
            
            // main 과 sub 컨테이너의 실을 상자를 구한다.
            val curMain = if (main.isNotEmpty()) main.peek() else -1
            val curSub = if (sub.isNotEmpty()) sub.peek() else -1
            
            // 메인 컨테이너가 비었으면 보조 컨테이너의 상자가 순서와 같은지 확인한다.
            // 같지 않으면 더 이상 트럭에 실을 수 없으므로 종료 한다.
            if (main.isEmpty()) {
                if (curSub == order[index]) {
                    result.add(sub.pop())
                    index++    
                } else {
                    break
                }
            } else {
                if (curMain != order[index]) {
                    if (curSub == order[index]) {
                        result.add(sub.pop())
                        index++
                    } else {
                        sub.add(main.pop())    
                    }
                } else {
                    result.add(main.pop())
                    index++
                }    
            }
        }
        
        return result.size
    }
}
728x90