본문 바로가기

전체 글131

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.
Linked List Linked List메모리 상에 원소들을 불연속적으로 배치한 선형 자료구조불연속적인 대신 이전이나 다음 노드의 위치를 알고 있음리스트의 각 원소를 노드라고 부름노드는 데이터와 다른 노드에 대한 참조를 가짐맨 앞/뒤 노드를 head/tail 노드라고 부름어떤 노드에 대한 참조를 갖느냐에 따라 크게 3가지 종류로 나눌 수 있음 Singly Linked List각 노드는 데이터와 다음 노드에 대한 링크(참조)를 가짐 Doubly Linked List각 노드는 이전, 다음 노드에 대한 링크(참조)를 가짐 Circular Linked List마지막 노드가 헤드 노드에 대한 링크(참조)를 가짐  성질1. 헤드 노드에 대한 참조만 가지고 있기 때문에 임의의 원소에 접근/변경하려면 O(n)의 시간이 소요2. 다른 노드.. 2024. 7. 21.
면접 후기 07월 18일 어제, 면접을 다녀왔다.어제 바로 글을 쓰면 좋았겠지만.. 싱싱미역 상태라서 글을 쓸 수가 없었다.그래서 오늘이라도 글을 남겨보려고 한다. 채용 절차사전 과제 -> 면접 진행3년차의 공고였고, 나는 신입이지만 자격요건에 어느 정도 부합해서 지원하게 되었다.그리고 감사하게도 사전 과제의 기회를 주셔 열심히 진행하게 되었다.  사전 과제사전 과제는 그리 어렵지 않은, iOS 개발자라면 가장 일반적으로 구현하게 되는 미션이었다.짧은 기간이지만, 나의 모든 역량을 보여주기 위해 노력했다.아키텍처로는 MVVM-C와 Clean Architecture를 사용했다. 이외에도 코드는 일관성있게, 깔끔하게 정리했고, 이해하기 쉽게 주석을 열심히 달아주었다.모든 구현을 마치고 리드미에 사용한 기술과 각 객체의.. 2024. 7. 19.