all 44

RxSwift: Delegate proxy

DelegateProxyDelegateProxy란 delegate method를 호출하는 객체와 구독자 사이에 delegate를 대신 처리하는 객체이다. 특정 delegate method가 호출되는 시점에 구독자로 next 이벤트를 전달한다.Delegate Pattern을 사용한 코드를 DelegateProxy를 구현해 Rxswift 형식으로 바꿔보자!// delegate pattern 코드func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // code}// rxswift 코드let locationManager = CLLocationM..

swift 2022.08.08

BFS 알고리즘으로 다익스트라 알고리즘 유도하기

Single source shortest pathunweighted graph → BFSweighted graph with nonnegative weights → Dijkstraweighted graph with negative weights → Bellman-ford, SPFAdirected acyclic graph → topological sorting용어 정의경로의 길이 : 경로가 지나는 간선의 가중치의 합정점 \(u\)에서 정점 \(v\)의 최단경로 : u에서 v로 가는 경로의 길이가 최소인 경로간선의 완화(edge relaxation) : 정점 \(u\)에서 \(v\)로의 간선에 대해 dist[\(v\)] > dist[\(u\)] + weight(\(u, v\)) 만족하면 dist[\(v\)]를..

RxSwift: Binder

Binder는 UI 바인딩에 쓰는 특별한 Observer이다. 아래와 같은 특징을 가진다.• 에러를 방출하지 않는다.Error가 방출되면 Observable의 시퀀스가 끊기기 때문에 UI 업데이트가 종료되기 때문이다.• 특정 스케줄러를 지정하지 않는 이상 메인 스케줄러에서 동작한다.UI 업데이트는 메인 스케줄러에서 동작하기 때문이다.타입public struct Binder: ObserverTypeObserverType의 제네릭 구조체이다.생성자target : Binder가 확장하는 UI 객체 클래스이다. (ex UILabel...)scheduler : 동작할 스케줄러 기본 값이 메인 스케줄러이다.binding : 보통 Value로 전달된 값을 Target에 있는 속성에 저장하는 클로저.public ini..

swift 2022.08.05

view resizing (ft. keyboard notification)

keyboard가 화면에 나타나거나 사라질 때 등록되는 notification을 이용해 키보드가 textview를 가리는 문제를 해결해보자! Keyboard Notifications When the system shows or hides the keyboard, it posts several keyboard notifications. These notifications contain information about the keyboard, including its size, which you can use for calculations that involve repositioning or resizing views. Registering for these notifications is the only w..

swift 2022.08.04

Rxswift: Connectable Observable Operators

Observable을 공유하게 하는 연산자 Observable은 구독자가 추가되면 항상 새로운 시퀀스를 만든다. 서버와 통신하거나 파일을 읽는 경우에 서로 다른 구독자가 같은 observable을 공유할 수 있도록 하여 불필요한 중복 작업을 피할 수 있다.multicast앞으로 나올 연산자들은 모두 multicast 연산자를 활용하여 만들어진 연산자들이다. multicast는 한 개의 subject를 매개변수로 받는다. source observable이 방출한 이벤트가 매개 변수의 subject로 전달되고 subject는 전달받은 이벤트를 다수의 구독자에게 방출한다. 기존의 observable과 구독자 사이의 1:1 관계에서 중간의 subject로 인해 1:n 관계로 바뀐 셈이다.multicast는 co..

swift 2022.08.02

RxSwift: Transforming Operators

Observable를 변환시키는 연산자toArrayCompleted 이벤트가 방출되면 지금까지 방출된 모든 요소를 하나의 배열로 만들어 Single로 전달하는 연산자이다.Single은 Observable의 하나의 형태로 한 개의 값 또는 에러 이벤트를 방출한다. 그렇기 때문에 구독시 success와 error의 형태로 이벤트를 구분한다.let disposeBag = DisposeBag()let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let subject = PublishSubject()subject .toArray() .subscribe { event in switch event { case .success(let result): ..

swift 2022.07.31

그리디 알고리즘 증명 방법1 - Greedy stays ahead

그리디 알고리즘(greedy algorithm)그리디 알고리즘은 완전 탐색, 동적 계획법처럼 답을 구하는 과정을 여러 개의 단계로 나누어 답을 만들어가는 과정은 비슷해보인다. 하지만 각 단계에서 가능한 모든 답을 계산하여 전체적으로 가장 좋은 답을 선택하는 것이 아닌,  각 단계에서 가장 좋은 답을 선택하는 점이 완전 탐색, 동적 계획법과 다른 점이다. 예를 들어 외판원 순회 문제에서 동적 계획법은 현재 정점에서 갈 수 있는 정점 중에 전체 거리를 최소화할 수 있는 정점을 고르지만, 그리디 알고리즘은 단순히 현재 정점에서 다음 정점까지의 거리를 최소화하는 정점을 고른다. 그리디 알고리즘은 "답을 도출하는 과정 중 매 순간 최고의 선택을 해서 결과적으로 최적의 해를 도출하자"로 표현할 수 있다. 그런데 매..

그래프에서 최장거리 구하기

그래프에서 최단거리는 경우에 따라 BFS, 다익스트라, 벨만 포드, 플로이드 와샬을 사용하여 구할 수 있다. 그렇다면 최장거리는 어떻게 구할 수 있을까?사이클이 없는 무향 그래프(트리)에서 최장거리트리에서는 어떤 두 노드를 선택해도 둘 사이의 경로가 항상 하나만 존재한다. 따라서 BFS을 이용하여 구할 수 있다.사이클이 없는 유향 그래프에서 최장거리일반적인 그래프에서 최장거리를 구하는 방법은 NP-Hard로 알려져 있다. 하지만 DAG(Directed Acyclic Graph)에서는 구할 수 있다. DAG에서 최장거리를 구할 수 있는 2가지 방법을 정리해보자.동적 계획법정점 $u$ → $v$의 최장거리를 구하는 점화식을 아래와 같이 세워보자.$$ D[i] = \text{정점 } i \text{ 에서} v..