본문 바로가기

전체 글34

[Swift] Quick Sort 구현해보기 [Swift] Quick Sort 구현해보기 퀵 정렬은 분할 정복 기법중에 하나다. 분할 정복이란 문제를 작은 두개의 문제로 분리하고, 각각 해결한 다음 결과를 모아서 문제를 해결하는 전략이다! 먼저 프로세스를 살펴보면 1. 배열 에서 이 될 하나의 원소를 고른다. 2. 피벗 앞에는 피벗보다 작은 값들이 오고, 피벗 뒤에는 큰 값이 오도록 배열을 두개로 나눈다. --> 이렇게 배열을 두개로 나누는 걸 분할이라고 한다. 3. 분할된 두개의 작은 배열에 대해 재귀적으로 과정을 반복한다. func quickSort(_ array: [Int]) -> [Int] { guard let first = array.first, array.count > 1 else { return array } let pivot = fi.. 2023. 4. 28.
[Swift] Queue 구현해보기 [Swift] Queue 구현해보기 Swift에서는 Queue 자료구조를 기본적으로 지원하지 않는다. Array의 배열의 맨 앞 원소를 지워주는 removeFirst()를 지원하긴 하지만 O(N) 시간복잡도를 갖는다. 제네릭 타입을 가지고, 시간 복잡도가 O(1)인 Queue를 구현해보자. struct Queue { private var inputStack = [T]() private var outputStack = [T]() mutating public func append(_ x: T) { inputStack.append(x) } mutating public func pop() -> T? { var top: T? while !(inputStack.isEmpty) { let x = inputStack... 2023. 4. 28.
한장으로 보는 UIViewController & UIView의 LifeCycle UIViewController & UIView의 LifeCycle(LayoutCycle)을 알아보자. 앱이든 웹이든 앞단을 개발한다면 사용자에게 쾌적한 경험을 제공해야 한다. 그러기 위해서 알아야 할 Life Cycle!!!! 어널언 UIKit의 VC, UIView의 Life Cycle에 대해 알아보자. 하루아침에 공부해서 정리할 양은 아닌 것 같아 꾸준히 업데이트 예정 💡잘못된 정보가 있으면 알려주세요! Constraint Update View의 제약 조건을 업데이트 Constraint는 실제로 View를 배치하는데는 영향을 주지 않음 특정 조건에 따라 Constraint를 갱신해서 다이나믹한 View를 구성할 수 있음 Constraint의 업데이트 순서는 View 계층 구조에서 가장 하위 View -.. 2023. 4. 27.
[Swift] Async Await와 MainActor의 관계에 대한 고찰 [Swift] Async Await와 MainActor의 관계에 대한 고찰 Swift에서 Concurrency 환경을 만들어야할 때 다양한 사용법이 있다. 특히 비동기로 데이터를 처리한 후 UI를 업데이트할 땐 MainThread에서 처리해야 한다. 여기서 MainActor를 사용함으로써 명시적으로 Main Thread로 컨텍스트 스위칭할 수 있다. 명시적으로 Main Thread에서 돌아가게 하는 방법은 여러 방법이 있는데 각각의 차이를 알아보자. 본격적으로 들어가기에 앞서, 환경부터 만들어보자. 환경 UILabel에 실제 API 호출을 통해 가져온 데이터를 바꾸도록 만들자. 우선 간단한 레이아웃 구조와 viewModel 인스턴스를 생성하자. class ViewController: UIViewContr.. 2023. 4. 26.
[Swift] 양방향 Linked List 구현해보기 [Swift] 양방향 Linked List 구현해보기 정의 단일 연결 리스트와 다른 점 이전 노드를 나타내는 포인터(prev)가 추가되었고, 리스트 자체의 tail도 있어 역방향 탐색이 절반정도 좋아짐 시간 복잡도 구현 class Node { var data: T var prev: Node? var next: Node? init(data: T, prev: Node? = nil, next: Node? = nil) { self.data = data self.prev = prev self.next = next } } class DoublyLinkedList { private var head: Node? private var tail: Node? init(head: Node? = nil, tail: Node? .. 2023. 4. 14.
[Swift] 단방향 Linked List 구현해보기 [Swift] 단방향 Linked List 단방향 링크드 리스트는 데이터를 갖고 있는 노드들을 포인터로 선형적으로 연결해 사용하는 자료구조 삭제와 삽입에 O(1)의 시간 복잡도가 걸리기 때문에 빈번하게 삽입/삭제가 필요한 상황에 유용 하지만 원하는 노드까지의 '탐색'은 O(N)이 걸림 따라서 배열처럼 동시에 인덱스를 통한 Random Access는 불가능하고, 처음부터 원하는 데이터가 나올 때까지 탐색을 진행해야 하기 때문에 O(N)의 시간 복잡도가 요구된다는 단점이 있음 /// /// data: 실제로 저장할 데이터 /// next: 현재 노드의 다음 노드를 저장할 데이터 /// class Node { let data: T var next: Node? init(data: T, next: Node? = .. 2023. 4. 13.