Raywenderlich
-
Chapter 10: TreesRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 7. 10:33
Tree는 정보를 구성하는 또 다른 방법으로, children과 parents의 개념을 사용한다. 매우 중요한 자료구조로, 소프트웨어 개발의 다양한 측면에서 사용된다. 계층적 관계를 나타낸다. 정렬된 데이터를 관리한다. 빠른 조회 작업을 처리한다. 모양과 크기가 다양한 여러 종류의 Tree가 있다. Terminology Tree에 관련된 여러가지 용어(Terminology)들이 있다. Node 연결리스트(Linked List)와 마찬가지로, Tree는 Node로 구성된다. 각 node는 데이터를 가질 수 있으며, 자식(children) node를 추적한다. Parent and child Tree는 실제 나무처럼 가지를 치는데, 방향은 반대로 위에서 시작해 아래로 뻗어나간다. 모든 node(최상위 root..
-
Chapter 9: Queue ChallengesRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 5. 22:05
Challenge 1: Stack vs. Queue 스택(Stack)과 큐(Queue)의 차이점을 설명한다. 각 자료 구조(Data Structure)에 대한 두 가지 실제 예제를 제시한다. Solution Queue는 선입선출(first-in-first-out) 이다. 먼저 삽입된 것이 반드시 먼저 제거된다. Queue는 후면에서 삽입되고, 전면에서 제거된다. Queue의 실제 예시는 다음과 같다. 영화관에서 줄 서기 : 티켓 구입 시 줄을 서서 순서대로 구매한다. 프린터 : 먼저 작업 queue에 올라간 파일부터 순차적으로 인쇄된다. Stack은 후입선출(last-in-first-out) 이다. 나중에 삽입된 것이 반드시 먼저 제거된다. Stack은 상단에서 삽입되고, 상단에서 제거된다. Stack의..
-
Chapter 8: QueuesRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 5. 08:39
영화 티켓을 구매하거나 프리터가 출력물을 인쇄할 때 큐(Queue) 자료구조와 같은 방식으로 진행된다. Queue는 FIFO(first-in first-out, 선입 선출)이다. 즉, 첫 번째로 추가된 요소가 항상 가장 먼저 제거된다. Queue는 요소의 처리 순서를 유지해야 할 때 유용하다. Common operations 큐(Queue) 프로토콜(protocol)을 정의한다. public protocol Queue { associatedtype Element //Swift 2.2 부터 typealias가 associatedtype으로 변경되었다. //String, Int 등의 지정된 type이 아니라, 견본의 type을 지정한다. //실제로 사용할 type은 protocol이 구현될 때 지정된다. /..
-
Chapter 7: Linked List ChallengesRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 5. 00:29
Challenge 1: Print in reverse 연결 리스트(Linked List)를 역순(revese)로 출력하는 함수를 만든다. 예를 들면 다음과 같다. 1 -> 2 -> 3 -> nil // should print out the following: 3 2 1 Solution 재귀(recursion)로 간단하게 구현할 수 있다. 재귀를 사용하면, 함수 호출을 Stack 으로 작성할 수 있다. 이 호출 Stack이 unwind 될 때 print구문을 출력해 주면 된다. 먼저, 연결 리스트의 끝까지 재귀적으로 순회한다. private func printInReverse(_ node: Node?) { guard let node = node else { return } //재귀 종료 조건 //node가..
-
Chapter 6: Linked ListRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 4. 15:58
연결 리스트(Linked List)는 단방향 sequence로 배열되어 있는 값들의 모음이다. 이론적으로 연결 리스트는 배열(Array)에 비해 몇 가지 장점이 있다. 리스트의 front에서 insert, remove 할 때 상수 시간(Constant time) 시간복잡도를 가진다. 안정적인 성능 다이어그램에서 알 수 있듯이 연결 리스트는 연결된 일련의 노드들이다(chain of nodes). 노드는 두 가지 역할을 한다. 값(value)을 유지(hold)한다. 다음 노드에 대한 참조(reference)를 유지한다. 해당 참조가 nil이라면 해당 노드가 리스트의 끝임을 의미이다. 여기서는 연결 리스트와 이에 관련된 연산외에도, Swift의 간결한 기능 중 하나인 COW(copy-on-write)를 구현한..
-
Chapter 5: Stack ChallengesRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 4. 08:12
Stack은 간단하지만, 여러 프로그램에서 사용되는 자료구조이다. Challenge 1: Reverse an Array 배열(Array)의 내용을 역순으로 출력하는 함수를 생성한다. Solution Stack의 주요 사용 사례 중 하나는 역추적(backtracking)이다. 일련의 값(value)을 Stack으로 push 한 후, 다시 pop하면 역순(reverse order)으로 배열된다. func printInReverse(_ array:[T]) { var stack = Stack() for value in array { stack.push(value) } while let value = stack.pop() { print(value) } } 노드를 Stack으로 push하는 시간 복잡도는 O(n) ..
-
Chapter 3: Swift Standard LibraryRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 2. 23:25
스위프트 표준 라이브러리(Swift standard library)는 Swift의 핵심 구성 요소를 포함하는 framework로, Swift 앱을 구축하는 데 도움이 되는 다양한 tool과 type 들이 있다. 사용자 정의 자료구조를 구축하기 전에 Swift standard library가 이미 제공하는 기본 자료구조를 이해하는 것이 중요하다. Array 배열은 순서가 지정된 요소 모음을 저장하기 위한 범용 container이며, 모든 Swift 프로그램에서 자주 사용된다. 요소를 쉼표로 구분하고 대괄호로 묶어 array literal을 생성할 수 있다. let people = ["Brian", "Stanley", "Ringo"] Swift는 protocol을 사용하여 배열을 정의한다. 각 protoco..
-
Chapter 2: ComplexityRaywenderlich/Data Structures & Algorithms in Swift 2020. 2. 2. 09:04
아키텍처 관점에서 확장성(scalability)은 앱을 쉽게 변경할 수 있는 것이다. 데이터베이스 관점에서의 확장성은 데이터를 데이터베이스에 저장하거나 검색하는 데 걸리는 시간에 관한 것이다. 그리고 알고리즘 관점에서의 확장성은 입력(input)의 크기가 증가함에 따라 실행 시간 및 메모리 사용량 측면의 성능을 나타낸다. 작은 양의 데이터로 작업할 때에는 저성능의 알고리즘도 빠르게 느껴질 수 있지만, 데이터의 양의 늘어남에 따라 성능 저하가 두드러진다. 따라서 얼마나 성능이 저하되는지 정량화하는 방법을 이해하는 것은 중요하다. 여기에는 실행 시간과 메모리 사용이라는 두 가지 차원에서 알고리즘(algorithm)의 확장성을 측정하는 Big O 표기법이 있다. Time complexity 최신 하드웨어의 성..
-
Chapter 1: Why Learn Data Structures & Algorithms?Raywenderlich/Data Structures & Algorithms in Swift 2020. 2. 1. 19:08
Data structure는 효율성에 관한 것이다. 데이터가 주어지면, 특정 목표를 달성하기 위해 이를 저장하는 가장 좋은 방법을 찾는다. 흔히, Array, Dictionary, Set 과 같은 Collection type을 사용한다. 각 자료구조(Data structure)에는 고유한 특성이 있다. 예를 들어 배열(Array)는 집합(Set)에 비해 요소 검색 시간이 훨씬 오래 걸리지만, 각 요소를 순서에 맞게 정렬할 수 있다. 자료 구조의 개념은 특정 언어에 한정되지 않는다. C의 자료구조와 Swift의 자료구조의 세부적인 구현은 다르지만, 구조와 개념은 동일하다. 알고리즘(Algorithm)은 작업을 완료하는 일련의 순서로, 그 예로는 정렬 알고리즘, 압축 알고리즘 등이 있다. 알고리즘은 소프트웨..