적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

카테고리 없음

[Swift 알고리즘] Programmers 택배상자

hongssup_ 2024. 7. 17. 15:55
반응형

Level 2 연습문제 (35분)

 

택배상자

1 ~ n 크기는 모두 같고 일렬로 전달됨. (n <= 100만)
but 택배 배달 순서에 맞게 트럭에 실어야. 
배달 순서 아니면 보조 컨테이너 이용해서 임시 보관.

앞 뒤로 이동 가능 but 맨 앞의 상자만 뺄 수 있음 (가장 마지막에 보관한 상자부터 꺼낼 수 있음)
순서대로 안되면 싣지 않음

4 3 1 2 5 -> 3 4 2 1 5 -> 2개 (1,2)
5 4 3 2 1 -> 1 2 3 4 5 -> 5개 


1. 입력 값 받아오면 컨테이너 순서 먼저 구하기
    값의 index 를 해당 값 index 에 넣도록
2. 1번 택배가 나올 때 까지 보조 컨테이너에 보관
    1번 싣고 다음 혹은 뒤에 2가 나와야함. 아니면 종료

import Foundation

func solution(_ order:[Int]) -> Int {
    var container = Array(repeating: 0, count: order.count)
    var sub = [Int]()
    var index = 1
    
    for (i, num) in order.enumerated() {
        container[num - 1] = i + 1
    }
    
    for box in container {
        if box == index {
            index += 1
            while sub.count > 0 {
                if sub.last == index {
                    sub.popLast()
                    index += 1
                } else {
                    break
                }
            }
        } else {
            sub.append(box)
        }
    }
    
    return index - 1
}

 

말을 애매모호하게 써놓아서 문제 이해하는데 5분 넘게 걸린둣 ㅋㅋㅋ 

역시 한쿡말이 제일 어려웡;;


배달 순서를 input 값으로 받아오기에, 해당 값을 index로 가지는 상자의 숫자로 재배열한다. 

4 3 1 2 5 -> 3 4 2 1 5
이렇게 컨테이너 벨트에 차례대로 도착한 상자들의 순서를 container 에 저장해 두고 상자들을 트럭에 실어본다..

다음 배달 순서 index 가 상자의 숫자와 일치한다면, index ++

일치하지 않으면 서브 컨테이너 안에 해당 상자 넣어주기

만약 보조 컨테이너 안의 마지막 상자가 index와 일치한다면 popLast() 해주고 index ++ (보조 컨테이너 안에 상자가 있다면 무한반복)

 

몇 개 실었는지 세어 보려면 0에서 부터 시작해야하는데, index는 시작이 1이었기 때문에 return 할 때 index - 1 해줘야함

(이거 귀찮으면 걍 result 변수 만들어서 index랑 같이 관리해줘도 댐. 근데 나는 그게 더 귀찮.. ㅎ)

 

 

 

 

728x90
반응형