재귀 용법 (Recursive Call)
함수 안에서 동일한 함수를 호출하는 형태. f(x) = x * f(x-1)
구현 패턴
최단경로 알고리즘 - 다익스트라 (Dijkstra)
최단경로 문제
가중치 그래프에서 두 노드를 잇는 가장 짧은 경로를 찾는 문제. 간선 가중치 합이 최소가 되는 경로를 탐색.
다익스트라 알고리즘
컴퓨터 과학자 다익스트라가 고안. 출발 노드에서 다른 노드로 가는 가장 짧은 경로 탐색.
음수 가중치를 가지지 않는 문제에만 적용 가능
동작 원리
- 시작 노드 거리를 0, 다른 모든 노드 거리를 무한대로 설정
- 방문하지 않은 노드 중 가장 거리가 짧은 노드를 선택하여 최소 힙 큐에 추가
- 큐에서 하나를 꺼내어 현재까지의 거리 + 간선 가중치를 계산
- 계산된 값이 기존 거리보다 작으면 거리를 업데이트하고 큐에 추가
- 큐가 빌 때까지 3, 4번을 반복
구현
퀵 정렬 (Quick Sort)
정렬 알고리즘의 꽃. 기준점(pivot)을 정하여 기준점보다 작은 데이터는 왼쪽(left), 큰 데이터는 오른쪽(right)으로 모으고, 각각을 재귀적으로 반복하는 정렬 알고리즘.
구현
탐욕 알고리즘 (Greedy)
미래의 결과를 고려하지 않고 각 단계에서 현재 상황에서 가장 좋아 보이는 선택을 하는 알고리즘.
장단점
- 장점: 구현이 간단하고 실행 속도가 빠름. 대규모 문제에 적용 가능
- 단점: 항상 전역 최적해를 보장하지 않음
예시) 10원, 50원, 70원, 100원 동전으로 140원 만들기
- Greedy: 100×1 + 10×4 = 5개
- 최적: 70×2 = 2개
적용 조건
- 각 단계의 최적 선택이 전체 문제의 최적 해로 이어질 때 (탐욕 선택 속성)
- 문제의 최적해가 부분 문제의 최적해를 포함할 때 (최적 부분 구조)
응용
- 최소 신장 트리
- 다익스트라 최단 경로 알고리즘
- 활동 선택 문제
- 분할 가능 배낭 문제
- 동전 거스름돈 문제 (특정 화폐 단위일 경우)
iOS Strong & Weak Reference (ARC)
Strong Reference
Swift 기본 참조 타입. 참조하는 인스턴스의 소유권을 가짐.
- 참조 카운트를 1 증가
- 참조가 유지되는 동안 인스턴스는 메모리에서 해제되지 않음
- 순환 참조 발생 시 해제 불가능한 상황 발생
iOS Timer 사용법
다른 메서드에서도 활용해야 할 경우
weak var로 선언하여 순환 참조 방지.
iOS 델리게이트 패턴 vs Java IoC (의존성 주입)
객체 간의 결합도를 줄이고 유연성을 높이는 데 사용되는 디자인 원칙이지만, 구현 방식과 목적에 차이가 있다.
델리게이트 패턴 (Swift)
한 객체가 자신의 일부 작업을 다른 객체에게 위임하는 디자인 패턴. 주로 1:1관계에서 사용되며, 위임받은 객체가 작업을 수행.
특징
- 1:1관계: 특정 작업을 하나의 대리자에게 위임.
- 명시적 호출: 작업이 발생하면 델리게이터가 대리자(델리게이트)의 메서드를 직접 호출
- 유연성: 대리자를 교체하거나 확장할 수 있으므로 코드 재사용성이 높음
- 구현 방식: 프로토콜을 정의하고, 대리자가 이를 구연하여 동작을 수행
iOS 델리게이트(Delegate) 패턴
객체 간 상호작용 처리를 위해 사용되는 디자인 패턴. 하나의 객체가 자신의 작업 일부를 다른 객체에 위임하는 구조.
주로 iOS 개발에서 UI 동작 처리, 데이터 전달, 상태 변화 알림 등에 사용.
특징
- 결합도 감소: 객체 간 의존성을 낮춰 코드의 유연성 확보
- 역할 분리: 각 객체가 자신의 역할에 집중하도록 설계
- 주의:
weak로 선언하여 강한 순환 참조 방지