큐 ( Queue )_자료구조(DataStructure_Swift) 큐 (Queue) 구현 아래와 같은 총 4가지의 큐를 구현할 예정입니다. 각각의 여러 방법에는 ‘성능 차이’ 가 있습니다만 여러 큐를 구현하며 똑같은 큐를 구현하되, 빠르고 효율적으로 구현하자는 취지입니다. 1. Array를 이용한 큐 구현 2. Doubly Linked List 이용한 큐 구현 3. Two Stack을 이용한 큐 구현 4. Ring Buffer를 이용한 큐 구현 Double Stack 이란? (위의 4가지 방법 중 가장 성능이 좋음) 더블 스택은 두개의 스택으로 큐를 구현하는 아이디어 입니다. 스택은 배열(Array)로 구현했었습니다 더블 스택은 배열의 마지막 요소를 제거하는 연산은 재정렬이 필요하지 않으므로 수행속도가..
큐 ( Queue )_자료구조(DataStructure_Swift) Doubly Linked List 이용한 큐 (Queue) 구현 아래와 같은 총 4가지의 큐를 구현할 예정입니다. 각각의 여러 방법에는 ‘성능 차이’ 가 있습니다만 여러 큐를 구현하며 똑같은 큐를 구현하되, 빠르고 효율적으로 구현하자는 취지입니다. 1. Array를 이용한 큐 구현 2. Doubly Linked List 이용한 큐 구현 3. Two Stack을 이용한 큐 구현 4. Ring Buffer를 이용한 큐 구현 연결 리스트가 가지는 기본적인 Node 클래스 public class Node { public var value: T // 값 public var next: Node? // 다음 노드 참조 public var previo..
큐 ( Queue )_자료구조(DataStructure_Swift) 큐(Queue)란 무엇인가? 사람들이 음식점에 줄을 서고 있는 모습을 상상해보자, 먼저 줄은 선 사람이 먼저 가게에 들어갈 수 있다. 이러한 상황은 일상생활에서 자주 발생되는데 이러한 현상을 컴퓨터로 표한한 것이 ‘큐(Queue)’ 이다. 큐(Queue)의 특징 ‘먼저 온 순서대로 먼저 작업을 해 준다. First - In - First - Out (FIFO) 이라고 부르기도 한다. 즉 큐는 FIFO 특성을 가진 자료 구조이다. 큐 (Queue) 구현 아래와 같은 총 4가지의 큐를 구현할 예정입니다. 각각의 여러 방법에는 ‘성능 차이’ 가 있습니다만 여러 큐를 구현하며 똑같은 큐를 구현하되, 빠르고 효율적으로 구현하자는 취지입니다. 1...
스택 ( Stack )_자료구조(DataStructure_Swift) 스택이란 무엇인가? 스택은 ‘어떤 것을 쌓는’ 인간의 활동을 컴퓨터에서 표현한 것 상자를 쌓는 것에 비유한다면, 그 상자가 스택구조의 ‘아이템’이된다 쌓은 상자를 옮긴다면 맨 위의 상자부터 옮긴다 즉, 상자가 들어온 순서대로 쌓이고 마지막부터 빠지는 원리 -> LIFO (Last In - Fist Out) 나중에 들어온 것이 먼저 빠진다 IOS 프로그래밍에서는 navigation controller 에서 stack 사용한다 스택의 종류 Push : 스택의 맨 위에 데이터를 ‘쌓는’ 것 Pop : 스택의 맨 위의 데이터를 ‘빼는’ 것 Push 구현 public struct Stack { //MARK: storage : 쌓여있는 것들을 배..
연결 리스트 값 제거 하기( LinkedList ) [3/3] 연결 리스트 제거 종류? Pop : 연결리스트의 맨 앞의 노드를 제거 RemoveLast : 연결리스트의 맨 뒤의 노드 제거 Remove(at:) : 연결리스트의 특정 노드를 제거 Pop 구현 -> pop() 리스트의 맨 앞의 노드를 제거함 public mutating func pop() -> Value? { //제거할 맨 앞의 노드 반환 하고, 그 노드 없애서 제거 구현 defer{ //삭제 하기 전에, 데이터가 남아있을 때 삭제할 노드 반환 해줘야 하기 때문에 defer //defer : 함수에서 제일 나중에 실행 되게 만들어주는 키워드! head = head?.next // 현재의 head 를 제거할 목적 , 현재의 head에 다음 노드..
연결 리스트 값 추가 하기( LinkedList ) [2/3] 연결 리스트 종류? Push: 리스트 맨 앞에 값 추가 하기 Append: 리스트의 맨 뒤에 값 추가 하기 Insert(after): 리스트의 특정 노드 뒤에 값 추가(삽입)하기 head와 tail 선언 하기 public struct LinkedList { // 전체 연결리스트를 관리하는 하는 LinkedList 구조체 public var head: Node? public var tail: Node? public init() {} // 모든 프로퍼티들 옵셔널이면 nil 로 초기화됨. public var isEmpty: Bool { return head == nil // head 와 nil 을 비교해서 nil 이라면 true 반환. head 가..
알고리즘 &. 데이터 구조을 공부하는 이유? 데이터 구조의 정의 프로그래밍에 있어 효율적이며, 확장 가능하고 유지 보수성 높은 시스템을 만들기 위한 주요 요소 중 하나 시스템에서 데이터의 공유, 유지, 정렬, 검색 등 데이터의 활용을 위한 데이터의 체계화 방법 추가 내용 영국의 컴퓨터 과학자 David Wheeler 가 정의한 데이터 구조에서 “컴퓨터 과학의 모든 문제는 새로운 차원에서의 접근 방식으로 해결될 수 있으며..” 라는 구절이 있다. 작은 애플리케이션은 물론, 모바일 애플리케이션, 그리고 그 기업을 위한 대규모 웹 어플리케이션 등 어떤 유형의 시스템을 개발하더라도 그 모든 애플리케이션의 토대는 결국 데이터로 귀결된다. 애플리케이션 개발에는 놀랄만한 성능의 효율성을 제공하는 프레임워크와 라이브러..
연결 리스트( LinkedList ) [1/3] 연결 리스트란 무엇인가? 선형적으로 (직선 같은 ) 단방향 연속성으로 정렬된 값의 모음이다. A collection of values arranged in a linear unidirectional sequence. 배열(Array)와는 다른 구조이다. 특징 값을 가지고 있다. 다음 노드의 ‘참조 정보’를 가지고 있다. (참조 정보를 가지고 있기 때문에 다음 노드를 가리킬 수 있다.(포인터 역할)) 위의 설명을 바탕으로 실제 코드로 구현합니다. 코드 & 설명 Node 구현 public class Node { //Node 클래스를 라는 Generics 타입으로, public 으로 모든 모듈에서 접근 가능하도록 정의 한다. public var value: Va..