ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] ArraySlice
    developing study 2024. 8. 26. 14:55

    프로그래머스에서 햄버거 만들기 Lv.1문제를 풀었는데 무심코 썼던 것들이 걸려서 계속 통과되지 못하는 상황들이 발생하게 됐다.

    그래서 이건 기록해야해하고 알게 된 것들이 있어서 얼른 기록...!!

    우선, 참고로 문제는 

    참고

    더보기

    햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

    예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

    상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

     처음 시도시 시간초과가 발생.

    아래 부분에서 문제가 발생한 것 같았다.

    if container.suffix(4) == order {
    ...}

    ( => suffix값이 ArraySlice임을 알지 못함!!!)

     

     

     

    그래서 다시,
    혹시 suffix한 값의 타입이 Array와 같지 않은가 해서 값에 담은 뒤 타입을 확인.  ArraySlice임을 확인!
    그래서 Array로 만들어줌

    let order = [1,2,3,1]
    let items = container.suffix(4)
    if Array(items) == order {
    ...}

    결과 : 통과

     

     

    ArraySlice

    이것 때문에 글을 작성하게 됨

    suffix를 변수로 저장하지 않고  stack.suffix(4) == order 이렇게 비교를 하게 되면 시간초과가 발생했었다.

    왜??그런 것인지 이유를 찾아봤다.

     

    우선, suffix한 결과값의 타입은 

     ArraySlice, Array의 SubSequence이다.

    apple document 설명

     

    여기에서 잘 봐야할 것!

    slice한 elements들을 복사하는 것이 아니라(new storage), 기존 Array에 대해 참조를 한다고 하는 문장!

    이게 장점이 될 수도, 단점이 될 수도 있다는 것을 생각해야한다.

    (Instead of copying over the elements of a slice to new storage, an ArraySlice instance presents a view onto the storage of a larger array.)

    (+)

    기존 배열과 동일한 인터페이스를 갖고 있기 때문에 사용하기 쉽다.(기존 배열의 index가 유지됨)

    (-) 주의사항으로 장기적으로 ArraySlice 인스턴스를 사용하는 것은 비권장한다.

    위에서 설명한 것처럼 기존 Array를 참조하고 있기 때문에 기존 Array의 lifetime이 끝난다고 해도 ArraySlice 인스턴스가 참조를 하고 있을 수 있음. 그러면 메모리 Leak이 발생할 수 있음!!!

    'developing study' 카테고리의 다른 글

    [Swift] 크레인 인형뽑기 게임 - 2차원 배열  (2) 2024.09.05
    [Swift] 탐욕법  (0) 2024.09.02
    [Swift] Combine - sink  (0) 2024.08.25
    TCA 적용해 iOS앱 만들기 - 첫번째  (0) 2024.08.24
    Swift - 비트연산자  (0) 2024.01.24

    댓글

Designed by Tistory.