[머릿말]
프로그래머스에서 햄버거 만들기 문제를 풀며 경험한 일이다. 분명 동일한 알고리즘으로 작성된 코드인데 suffix(_:) 함수의 결과를 저장하지 않고 사용하면 시간 초과가 발생하고, 저장하고 사용하면 통과가 되는 것이다..! 단순히 저장의 유무에 따라 결과가 달라지는 것이 궁금하여 관련 이유를 찾아보게 되었고 알게 된 내용을 정리하고자 한다.
⦿ 코드
import Foundation
func solution(_ ingredient: [Int]) -> Int {
var stack: [Int] = []
var count = 0
// 재료 배열을 하나씩 탐색
for item in ingredient {
stack.append(item)
// 햄버거의 패턴이 발견되면 count 증가 후 재료 제거
let suffix = stack.suffix(4)
if suffix == [1, 2, 3, 1] {
stack.removeLast(4)
count += 1
}
}
return count
}
이 글에서 다룰 부분은 중간 쯤의 `let suffix = stack.suffix(4)` 부분이다. 위 코드는 저장하고 사용하는 방법인데 저장하지 않고 사용하는 방법에서는 해당 문장의 바로 아래 if 조건문에 `stack.suffix(4)`를 바로 사용하는 것이다.
⦿ Suqsequence(ArraySlice)란?
애플 공식 문서에 따르면 SubSequence는 ArraySlice의 별칭이다.
그리고 ArraySlice에 대한 공식 문서의 설명은 위와 같은 내용을 담고 있다. 핵심 내용은 다음과 같다.
- ArraySlice 타입은 큰 배열의 동작을 빠르고 효율적으로 할 수 있게 한다.
- 배열의 일부분을 새로운 저장소로 저장하는 방법 대신, 기존 배열에 대한 뷰를 나타낸다.
- 이 둘은 서로 동일한 인터페이스를 나타내므로 ArraySlice에서도 원본 배열에서 할 수 있는 작업을 그대로 할 수 있다.
⦿ 저장하고 사용하는 방법과 저장하지 않고 사용하는 방법의 차이점은?
저장하지 않는 방법(Suqsequence)은 새로운 저장소로 저장하지 않고 기존 배열을 참조하는 방법이다. 반면 저장하는 방법은 새로운 저장소에 저장하는 방법이다. 즉, 저장하지 않는 방법은 "참조 타입(Reference Type)"이고, 저장하는 방법은 "값 타입(Value Type)"이라는 것인데 이 둘의 차이는 다음과 같다.
참조 타입(Reference Type) | 값 타입(Value Type) | |
저장 위치 | 힙(Heap) | 스택(Stack) |
할당 시점 | 런타임(Runtime) | 컴파일(Compile) |
속도 | 느림(Slow) | 빠름(Fast) |
참조 타입은 힙 영역에 할당되고 해제되는데 이는 런타임, 즉 실행 중에 결정되기 때문에 그만큼의 리소스가 소모되므로 속도가 느리다. 반면 값 타입은 스택 영역에 할당되고 해제되는데 이는 컴파일, 즉 실행 전에 결정되기 때문에 힙 영역에 할당하는 참조타입에 비해 속도가 빠르다는 특징이 있다.
⦿ 애플에서 권장하는 방법은?
참조 타입은 원본 데이터를 그대로 참조하는 것이므로 참조가 꼬이거나 여러 곳에서의 참조가 이뤄지면 잘못하다가 데이터가 의도치 않게 손상될 수 있다. 반면 값 타입은 원본 데이터를 복사하는 방법이므로 애초에 별도의 데이터가 되기에 원본 데이터가 손상될 일이 없다. 그러므로 애플에서는 특별한 경우를 제외하고는 값 타입을 사용할 것을 권장하고 있다.
단순 저장을 하느냐, 안하느냐의 차이임에도 불구하고 시간 초과 오류가 발생하는 것이 너무나도 궁금했었다. 이 내용을 찾아봄으로써 참조 타입과 값 타입에 대해 잘 알 수 있게 되었고, 이러한 부분이 '기본기'를 갖춰간다고 말할 수 있는 부분인 것 같다.
위 코드를 파이썬으로 작성하면 저장 여부와 관계없이 통과가 되는데 이래서 코테는 파이썬으로 하라는 것인가 싶기도 하다...🤣
'[Programming Language] > [Swift]' 카테고리의 다른 글
[Swift] ~= 연산자 : 범위 확인 연산자, 패턴 매치 연산자 (0) | 2024.10.24 |
---|---|
[Swift] String.allSatisfy(_:) 함수란? (0) | 2024.09.23 |
[Swift] ASCII Code 변환 방법(숫자 <-> 문자 변환 방법) (0) | 2024.08.22 |
[Swift] @discardableResult - 반환값 무시 (0) | 2024.08.21 |
[Swift] 선언형 프로그래밍 vs 명령형 프로그래밍 (0) | 2024.08.20 |