[프로그래머스] 택배상자

silverCastle·2022년 11월 2일
0

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

✍️ 첫번째 접근

필자가 처음 작성한 코드르 보면서 설명하기 애매하게 논리가 부족함을 느껴 첫번째 작성한 코드는 생략하고 테스트 케이스를 작성한다.

Text Case

[3, 5, 1, 2, 6, 4]
2

[2, 1, 6, 7, 5, 8, 4, 9, 3, 10]
10

[2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
10

[1]
1

[2, 1, 3, 5, 4]
5

[2, 1, 6, 4, 3, 5]
3

✍️ 두번째 접근

기존 컨테이너 벨트는 1부터 상자 개수까지의 Array, 보조 컨테이너 벨트는 빈 Array 선언한다.
보조 컨테이너 벨트가 비어있다면 기존 컨테이너의 앞에 있는 상자부터 택배 기사님이 원하는 상자 번호의 이전까지의 상자를 보조 컨테이너에 넣는다.
기존 컨테이너 벨트 앞에 있는 상자가 택배 기사님이 원하는 상자 or 보조 컨테이너 벨트 마지막에 있는 상자가 택배 기사님이 원하는 상자일 경우 answer를 하나씩 증가한다. 기존 컨테이너 벨트에 있는 상자라면 인덱스를 하나 증가해주고, 보조 컨테이너 벨트에 있는 상자라면 removeLast()를 해준다.
만약 원하는 상자가 없을 때 기존 벨트에 있는 상자가 택배 기사님이 원하는 상자보다 값이 작을 경우 보조 벨트에 더 넣을 수 있으므로 더 넣고 기존 컨테이너 벨트에 있는 상자가 원하는 상자인지 비교한다.
그럼에도 원하는 상자가 없다면 더이상 찾을 수 없으므로 종료하는 방식으로 문제를 해결하였다.

import Foundation

func solution(_ order:[Int]) -> Int {
    if order.count == 1 {   // order의 길이가 1이라면 택배 기사님이 원하는 순서로 바로 실을 수 있기 때문
        return 1
    }
    var answer = 0
    let n = order.count // 상자의 개수
    var arr = Array(1...n)  // 기존 컨테이너 벨트
    var support: [Int] = [] // 보조 컨테이너 벨트
    var idx = 0 // 기존의 컨테이너 벨트에 대한 인덱스
    for o in order {
        // 보조 컨테이너 벨트에 삽입
        if support.isEmpty {
            if o-2 >= idx && idx < n {
                support = Array(arr[idx...o-2])
                idx = o-1
            }
        }
        // 기존의 컨테이너 벨트에 있는 상자가 택배 기사님이 원하는 상자일 경우
        if idx < n && arr[idx] == o {
            answer += 1
            idx += 1
        }
        // 보조 컨테이너 벨트에 있는 마지막 상자가 택배 기사님이 원하는 상자일 경우
        else if !support.isEmpty && support.last! == o {
            answer += 1
            support.removeLast()    // 벨트에 있는 마지막 상자를 택배에 실었으니 뺀다.
        }
        else {
            // 기존 벨트에 있는 상자가 택배 기사님이 원하는 상자보다 값이 작을 경우 보조 벨트에 더 넣을 수 있으므로
            if idx < n && arr[idx] < o {
                while idx < n && arr[idx] < o {
                    support.append(arr[idx])
                    idx += 1
                }
                // 보조 벨트에 넣었으면 기존 벨트에 있는 상자가 원하는 상자인지 비교
                if idx < n && arr[idx] == o {
                    answer += 1
                    idx += 1
                }
            }
            // 기존 벨트와 보조 벨트 모두에서 원하는 상자가 없을 경우
            else {
                break                
            }
        }
    }
    
    return answer
}

0개의 댓글