본문 바로가기

전체 글133

Concurrency에 관하여 코어코어는 CPU의 핵심으로 CPU에서 실제로 일을 처리하는 역할을 수행.한 번에 한 가지 일만 처리할 수 있음멀티 코어는 여러 일을 동시에 처리할 수 있음 그렇다면 싱글 코어에서 여러 작업을 수행못함?동시성이라는 개념을 통해 가능하다.동시성이란 시분할로 여러 작업을 반복적으로 옮겨가며 처리함으로써 동시에 작업이 수행되는 것처럼 보이는 것따라서 싱글 코어에서도 동시성을 이용하여 여러 작업을 동시에 실행할 수 있음 그럼 코어의 갯수가 많으면 많을수록 성능이 훨씬 좋겠네?거의 그렇지만, 백퍼센트는 아님멀티 코어에서는 어떤 코어가 어떤 일을 할 지 작업을 나눠야 하는데, 이 과정에서 딜레이가 발생하여 오히려 싱글 코어보다 작업 속도가 줄어들 수 있음또한 소프트웨어가 싱글 코어에 최적화되었다면, 멀티 코어라도 .. 2024. 7. 28.
Queue Queue한쪽 끝(rear)에서 데이터의 삽입(enqueue)이 일어나고, 반대쪽 끝(front)에서 삭제(dequeue)가 일어나는 선형 자료구조그런 구조이기 때문에 FIFO의 형태로 동작 시간 복잡도rear나 front 외, 원소들의 확인 및 변경은 원칙적으로 불가능연산의 시간 복잡도Rear나 front에 원소 추가(enqueue), 제거(dequeue)O(1)Rear나 front의 원소 확인O(1) 구현배열이나 연결리스트 등으로 구현 가능구현struct Queue { private var array: [T?] = [] private var frontIndex = 0 var front: T? { guard frontIndex T? { guard fr.. 2024. 7. 24.
Stack 유형 - 문자열 문자열 문제스택을 사용하는 문자열 문제는 자주 나옵니다. 일반적인 문자열 문제는 문자열을 순회하면서, 문자를 스택에 넣고, 각 반복에서 현재 문자와 스택의 맨 위 문자를 비교하는 것이 있습니다. 스택은 가장 마지막 문자를 가지고 있기 때문에 문자열 매칭에 유용합니다.  예제 1주어진 문자열 s는 (, ), {, }, [, ] 만 포함합니다.입력 문자열이 유효한지 판단하세요.문자열이 유효하려면 모든 여는 괄호가 동일한 유형의 닫는 괄호에 의해 올바른 순서로 닫혀야 하며, 각 닫는 괄호는 정확히 하나의 여는 괄호를 닫아야 합니다.예를 들어, s = ( { } ) 는 유효하지만, s = ( ] 는 유효하지 않습니다. 방법올바른 순서는 이전의 여는 괄호가 무엇이었는지에 의해 결정됩니다. 닫는 괄호가 나타날 때마.. 2024. 7. 23.
Stack Stack한 쪽 끝에서만 데이터의 추가(push)와 삭제(pop)가 일어나는 선형 자료구조이러한 구조로 인해 Last In First Out의 형태로 동작 시간복잡도최상단 원소를 제외한 나머지 원소들의 접근 및 변경은 원칙적으로 불가능추가 (Push)O(1)제거 (Pop)O(1)최상단 원소 확인 (Top)O(1) 구현배열이나 연결리스트 등으로 구현이 가능ex) 배열을 이용한 구현struct Stack { private var array: [T] = [] var size: Int { array.count } var isEmpty: Boot { array.isEmpty } var top: T? { array.last } mutating func push(_ newEl.. 2024. 7. 23.
Linked List 유형 - 반전 처리 반전 처리연결 리스트를 반전하는 것은 흔한 인터뷰 문제이지만, 다양한 문제를 해결하는 데 사용할 수 있는 기술이기도 합니다. 이유는 포인터를 이동시키는 방법에 대한 깊은 이해를 요구하기 때문입니다. 오늘은 이것에 대해 제대로 학습해봅시다. 가정연결리스트 1 -> 2 -> 3 -> 4 가 있다고 가정하고, 이를 4 -> 3 -> 2 -> 1로 반환하고 싶다고 해봅시다. 현재 우리가 위치한 노드를 나타내는 포인터 curr이 있습니다. 처음에는 curr이 1에 위치하게 됩니다. 반전을 위해서는 2가 -> curr을 가리키도록 해야 합니다. 여기서 문제는 curr = curr.next 로 이동하면, 단일 연결리스트이기 때문에 1에 대한 참조가 사라진다는 것입니다. 이를 해결하기 위해 이전 노드를 추적하는 또 다.. 2024. 7. 22.
Linked List 유형 - Fast & Slow 연결 리스트 유형의 풀이 방법 중 하나는  Fast와 Slow라는 두 개의 포인터를 사용하는 것입니다. 두 포인터는 나란히 움직이지 않고, 다른 '속도'로 이동하거나, 다른 위치에서 반복을 시작하는 등의 차이를 의미합니다. 다른 '속도'로 이동한다고 했다면, 일반적으로 Fast 포인터는 반복 당 두 노드를 이동하고, Slow 포인터는 반복 당 하나의 노드를 이동합니다. 코드를 봅시다.// head는 링크드 리스트의 첫 번째 노드를 가리킵니다.func fn(head: ListNode?) { var slow = head var fast = head // fast가 nil이 아니고 && fast.next가 nil이 아닐 때까지 while fast != nil && fast?.next !=.. 2024. 7. 21.