'햄버거 만들기' 라는 알고리즘 문제를 오늘 풀게 되었다.
그런데 내가 작성한 방법으로는 계속 시간초과로 인해 실패하면서 방법을 3번이나 바꿔서 풀었는데도 시간초과로 인한 실패를 해결하지 못해서 결국 구글링을 하기로 했다.
구글링을 통해 다른 사람의 풀이 방법을 살펴 보던중에 나와 같은 방법인데 성공한 방법을 찾게 되어서, 그 사람과 나의 풀이 방법의 차이점을 찾아 보게 됐다.
차이점은 Array(stack.suffix(4)) 이 부분 이였다.
[참조 블로그]
글을 작성한 사람도 처음엔 문제의 최대 소요시간이 오래걸려서 해결방법을 찾고, 그 방법을 작성해 놓아서 나도 그 글을 읽고 이해하게 되었다.
블로그의 내용을 정리하자면 stack.suffix(4)는 ArraySlice 타입인데, 새로운 타입으로 재생성 되는게 아니라 강한 참조로 엮여있을 확률이 있다는 얘기다.
그렇기 때문에 메모리 누수가 발생하고, 시간초과가 발생할 수 있다는 것이다.
그래서 Array(stack.suffix(4)) 이렇게 작성하면, 새로운 배열을 생성하기 때문에 강한 참조로 인해 메모리 누수가 발생하지 않게 된다.
또는 아래와 같이 변수에 값을 넣고 비교해도 시간초과는 발생하지 않는다.
let suffix = stack.suffix(4)
if suffix == [1, 2, 3, 1] {
stack.removeLast(4)
result += 1
}