Kotlin/Algorithm Problems

<프로그래머스> 택배상자(Lv.2)

re트 2023. 12. 6. 11:46
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata

[프로그래머스]

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

 

글이 많아서 약간 풀기도 전에 질릴 뻔 했지만 차분히 마음을 가라앉히고 보니까 생각보다 간단해보이는 문제였다.

주어지는 조건들에서 ArrayDeque를 써야겠다는 생각이 들더라

서브 컨테이너 벨트의 뒤에서만 택배를 빼야하기 때문이다.

 

이후에는 쉽게 진행되었다.

실어야하는 순서를 보며 서브 컨테이너에 넣을지, 트럭에 실을지, 종료시킬지 정하기만 하면 되더라

물론 숫자가 1000000까지라서 시간이 걸릴까 걱정했지만 걸리지 않았다.

(정확히 모르겠어서 질문을 통해 알아봐야겠다.)

 

isBreak 변수는 서브 컨테이너 벨트에서 가져온 적이 있는지 확인하는 변수다.

이를 통해서 서브 컨테이너 벨트 가져왔을 때는 메인 컨테이너 벨트에서 가져오지 못하도록 한다.

 

해당 방법으로 작성한 코드는 다음과 같다.

class Solution {
    fun solution(order: IntArray): Int {
        var answer: Int = 0
        val subContainer = ArrayDeque<Int>()

        var item = 1
        var isBreak = false
        // 실어야하는 순서대로 반복
        for (seq in order) {
            // 실어야하는 순서와 현재 택배 번호
            while (item != seq) {
                // 현재 택배 번호가 작을 때
                if (item < seq) {
                    subContainer.add(item++)
                } 
                // 현재 택배 번호가 클 때
                else {
                    // 서브 컨테이너 벨트 확인
                    if (subContainer.last() == seq) {
                        subContainer.removeLast()
                        answer++
                        isBreak = true
                        break
                    } else {
                        return answer
                    }
                }
            }

            // 내부 반복문에서 서브 컨테이너 벨트의 값을 빼온 경우에는 실행하지 않음
            if (!isBreak) {
                item++
                answer++
            }
            isBreak = false
        }

        return answer
    }
}

 

어제와는 또 다르게 금방 풀리는 문제였다.

반응형