○
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랑 같이 관리해줘도 댐. 근데 나는 그게 더 귀찮.. ㅎ)