본문 바로가기

728x90

전체 글

(104)
[자료구조] 큐-2 (원형 큐) 기존의 선형 큐는 dequeue를 하면 앞 부터 쌓였던 데이터가 빠져나간다. Head는 빠져나간 자리의 다음 데이터를 가리키게 되며 비어있는 자리로는 데이터를 추가 할 수 없게 된다. 굳이 재사용을 하겠다면 dequeue를 하고 비어있는 자리를 메꾸기 위해 뒤 데이터들을 앞쪽으로 당겨야하는 작업이 필요한데 , 그렇게 되면 O(n)만큼의 시간복잡도가 발생하게 된다. 이런 비효율적인 구조를 보안한 것이 바로 원형 큐다. 원형큐의 동작이 어떻게 이뤄지는지 그림으로 보자. 순서는 좌측 상단부터 시작한다. enqueue를 진행하면서 rear는 계속 한 단계 뒤의 공간을 가리키게 된다. dequeue를 진행하면 선형 큐의 방식처럼 head(front)도 한 단계 뒤로 계속 이동한다. 선형 큐와 똑같아 보이지만 de..
[자료구조] 큐-1 이번에 정리해 볼 것은 Queue! iOS개발을 하다보면 DispatchQueue... 와 같은 Queue개념을 사용하는 API들이 존재하는데 , 큐는 선입선출(First In First Out - FIFO) 방식으로 데이터를 순서대로 관리한다. 무슨 말이냐. 데이터를 관리하는 큐 공간에 A-B-C의 데이터를 순서대로 넣었다면, 데이터를 뽑는 순서도 A-B-C가 들어간 순서 그대로를 보장한다는 것이다. 그렇기 때문에 큐는 순서를 보장해야 하는 작업을 해야할 때 주로 사용 하는 자료구조이다. 마치, 마트의 계산대에서 계산하려고 줄을 기다리는 사람들의 모양이랄까. 한 줄로 늘어선 줄은 앞에 선 사람 부터 차례로 계산을 하고 빠져나간다. 큐도 이와 같은 방식으로 동작한다고 생각하면 된다. 큐의 종류 선형 큐와..
[자료구조] 연결리스트-3 (양방향 연결 리스트) 2021.07.12 - [자료구조] - [자료구조] 연결 리스트-1 2021.07.12 - [자료구조] - [자료구조] 연결리스트-2 (추가/삭제)- 에 이은 내용 이전 포스팅의 Remove에서 마지막 노드를 삭제하기 위해 head부터 마지막 노드까지 순차적으로 이동했다. 나중에 정리하겠지만, 이렇게 삭제를 하게 될 경우 remove시도 시 데이터의 갯수만큼 시간복잡도가 증가하기 때문에 빅오 표기법으로 O(n)의 시간복잡도를 갖게 되는 최악의 알고리즘이 된다. 이를 피하기 위해서 검색알고리즘을 사용하는데 지금 우리는 알고리즘을 추가하여 시간복잡도를 줄이기 보다, Head와 마찬가지로 Tail이라는 마지막 노드를 가리키는 변수를 추가하여 마지막 노드를 삭제해보려 한다. 이때 양방향 연결리스트에 대해서 함께..
[자료구조] 연결리스트-2 (추가/삭제) 2021.07.12 - [자료구조] - [자료구조] 연결 리스트-1 에 이은 내용 앞선 포스팅에서 노드를 구성했다면 이번 포스팅에선 노드를 관리하고 추가/삭제가 용이한 연결리스트 클래스를 만들것이다. 노드클래스가 준비되었으니 바로 시작하자. LinkedList클래스를 생성하면 head라는 속성을 추가해준다. 변수명은 조금 달라도 되지만 보통 첫번째 노드를 가리키는 명칭이면 된다. head에는 LinkedList의 첫번째(0번째) 노드를 할당하자. 1. Append class LinkedList { var head: Node? func append(value: Int) { let newNode = Node(data: value) if head == nil { head = newNode } else { va..
[자료구조] 연결 리스트-1 자료구조의 리스트는 순차리스트(배열)과 연결리스트(Linked List)로 나뉜다. 연결리스트는 순차리스트와 달리 삽입/삭제 등 변화에 더욱 편리한 자료구조인데, 이러한 강점은 연결리스트의 각 요소가 어떻게 구성되는지 알면 이해가 된다. 연결리스트의 각 요소를 Node(이하 노드)라고 하는데, 노드는 정보를 담는 데이터와 연결된 다른 노드의 주소(포인터)를 담는다. 그림으로 표현한다면 아래와 같다. Data와 Next Address를 묶어서 하나의 노드라고 한다. Next Address는 위에서 말한 다음 노드의 주소를 담고있다. 언어에 따라서 NextAddress에 타입은 적절한 형태로 바뀔 수 있겠지만 보통의 경우 NextAddress에 할당되는것은 다음으로 연결되어야 할 노드의 주소가 된다. 노드 ..
Closure와 객체의 생명주기의 관계 Closure의 중첩 시 weak은 어디까지 self를 붙잡아(강한 참조) 두는가? 표현할 수 있는 적절한 말이 무엇인지는 잘 모르겠다. Swift의 closure를 사용할 때 Capturing이 되면서 self(객체)의 강한 참조가 발생한다. 이때 강한 참조 인해 발생하는 문제들을 피하기 위해 weak을 사용하여 약한 참조 형태로 self에 접근하는 것이 일반적인 방법이다. 그렇다면 중첩된 closure는 weak의 위치에 따라 어떻게 동작할까? 만약 아래와 같은 코드를 작성했을 때 weak이 사용되는 위치에 따라 어떤 결과가 나오는지 확인해보려 한다. Case 1. escaping Closure를 받는 메서드를 호출했을 때 위치 1을 보면 loadContentFromSource를 호출하는 첫 번째 클..

728x90