병합 정렬은 반으로 나누고 합치면서 정렬합니다. 코드를 살펴봅시다. 위 코드에서 mergeSort 함수는 반으로 나누는 역할을 하며 merge함수는 합치는 역할을 합니다. 큰 흐름을 살펴보면 mergeSort함수를 통해 중간 인덱스를 잡고 왼쪽 오른쪽으로 나눕니다. 나눈 배열을 재귀로 다시 mergeSort로 넘깁니다. 그리고 배열의 길이가 1이면 리턴하게 됩니다. 그럼 배열 count가 1이 될 때까지 나누어지겠죠. 이후 나뉜 배열에 대해서 merge가 실행됩니다. merge가 실행되는 순서는 위와 같습니다. [1][5]에서 처음 merge가 실행되며 [4][1,5]에서 두 번째 merge가 실행되며 [3][6]에서 세 번째 merge가 실행되며 [2][7]에서 네 번째 merge가 실행되며 [3,6]..
버블 정렬은 옆에 있는 값과 비교해서 정렬하는 알고리즘입니다. 버블 정렬은 계속해서 옆 원소랑 비교하며 정렬합니다. 또한 한 번의 external for loop가 끝났을 때 가장 큰 값이 맨뒤로 갑니다. 코드를 살펴봅시다. arr는 우리가 정렬해야 할 배열이며, 1부터 7까지 정렬되지 않은 상태로 존재합니다. arr의 크기는 7이고 인덱스는 0부터 6까지 입니다. external for loop는 6부터 시작해서 아래로 내려오며, internal for loop는 0부터 external의 i까지 올라가며 비교하며 정렬하기 위함입니다. 차근차근 살펴봅시다. external for loop의 i값은 6이며 internal for loop의 j값은 0부터 5까지 실행됩니다. j가 0인 경우를 살펴봅시다. a..
삽입 정렬은 적절한 인덱스에 삽입해주는 정렬입니다. 삽입 정렬은 두 번째 원소부터 시작해서 그 앞의 원소들과 비교해 삽입할 위치를 지정한 후, 지정한 자리에 원소를 삽입해 정렬합니다. 또한 앞에 있는 원소는 이미 정렬되어 있다고 가정합니다. 코드를 살펴봅시다. arr는 우리가 정렬해야 할 배열이며, 1부터 7까지 정렬되지 않은 상태로 존재합니다. arr의 크기는 7이고 인덱스는 0부터 6까지 입니다. 두 번째 원소부터 시작한다 했으니 for문은 인덱스 1부터 6까지 돌기 위한 용도이며, while문은 for문의 i보다 아래 인덱스 중 큰 값이 있으면 swap하기 위한 용도입니다. y는 아래 인덱스까지 모두 탐색하기 위한 변수입니다. 그럼 차근차근 살펴봅시다. for loop에서 i가 1일 때 y가 1인 ..
선택 정렬은 가장 작은 값을 찾아서 앞으로 보내주는 정렬입니다. 첫 번째 원소를 두 번째 원소부터 마지막 원소까지 차례대로 비교하여 가장 작은 값을 찾아 첫 번째에 놓고, 두 번째 원소를 세 번째 원소부터 마지막 원소와 차례대로 비교하여 그중 가장 작은 값을 찾아 두번째 위치에 놓는 과정을 반복합니다. + 선택정렬을 코드로 작성할 때는 가장 작은 값을 찾기 위한 min값이 있어야합니다. 코드를 살펴봅시다. arr는 우리가 정렬해야 할 배열이며, 1부터 7까지 정렬되지 않은 상태로 존재합니다. arr의 크기는 7이고 인덱스는 0부터 6까지 입니다. (external for loop) 외부에 있는 for 루프는 최솟값이 놓일 인덱스를 위해 사용합니다. (internal for loop) 내부에 있는 for ..
애드몹을 통해 모바일에 광고를 달 수 있습니다. 기존에 존재했던 프로젝트에 구글 애드몹을 적용해봤습니다. 먼저 구글 애드몹에 들어가셔서 https://apps.admob.com/v2/home 앱 추가를 해줍니다. 그러면 아래와 같은 화면이 나올 거예요. 본인이 앱 스토어에 등록하셨으면 예 아니면 아니요를 눌러주세요. 저는 이미 등록한 프로젝트에 적용한 거라 예를 눌렀습니다. 앱 이름이나 개발자 이름 또는 앱 ID로 검색하면 프로젝트가 뜹니다. 원하는 프로젝트를 추가해주세요. 앱을 추가해주면 앱 ID가 생성됩니다. 여기서 생성된 앱 ID를 어디에 복사해놔 주세요. 이거 필요해요. 애드몹을 실행하려면 앱의 소스코드와 info.plist파일에 추가해줘야 합니다. 다음 단계로 광고 단위를 만들어 줍니다. 여기서..
디스패치 세마포어를 알아보기 전에 세마포어는 무엇일까요? 세마포어는 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것입니다. 뮤텍스는 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것입니다. 또한 세마포어는 뮤텍스가 될 수 있습니다. (그 반대는 불가합니다.) 이제 디스패치 프레임워크 내에 있는 디스패치 세마포어 클래스에 대해서 알아보겠습니다. 디스패치 세마포어를 사용하게 된 계기는 async한 작업을 sync하게 변경시켜보는 시도에 세마포어를 사용하면 어떨까 싶었고, 한 번도 사용해보지 못했던 클래스라 궁금했었기에 사용해봤습니다. 그럼 애플에서 제공하는 공식문서를 살펴봅시다. 디스패치 세마포어란 다중 실행 콘텍스트에서 자원 접근을 제어하는 객체입니다. 디스패치 세마포어는 전통적..
수요일에 받은 코드 리뷰를 통해 좋은 말씀들을 많이 해주셔서 하나씩 학습해 정리해보려 합니다. 그중에서도 제네릭과 프로토콜을 활용해 dequeueReusableCell을 어떻게 처리하는지 알아보았습니다. 먼저 테이블 뷰에 테이블 뷰 셀을 나타내게 하려면 어떻게 하시나요. 테이블 뷰는 데이터 자체를 관리하지는 않고, 표현되는 데이터만 관리합니다. 그래서 우리는 UITableViewDataSource를 채택해 필수 메소드를 적어줍니다. 이 친구들이 관리를 합니다. 아래는 UITableViewDataSource에 필수 메소드를 작성한 코드입니다. // Return the number of rows for the table. override func tableView(_ tableView: UITableView..
디스패치 그룹은 단일 장치와 같이 task들의 그룹을 모니터 하는 것입니다. 디스패치 그룹을 사용하게 된 이유는 여러 개의 request를 날렸고 response가 끝나는 시점을 잡아 한 번에 UI를 업데이트시키기 위해 DispatchGroup을 사용하게 되었습니다. DispatchGroup을 사용하기 이전에는 어떻게 처리했냐면.. 음 프로퍼티 옵서버를 사용했습니다. didSet을 사용하면 프로퍼티가 변경된 바로 직후를 파악할 수 있어서 그냥 프로퍼티 옵저버를 사용했습니다. 다시 말해 API콜을 날리면 response데이터로 weatherInfo을 하나씩 받게 되고, 받은 데이터를 weather에 append 해주는 방식으로 처리했습니다. 위와 같이 제가 초기에 구현했던 코드로 여러 reponse데이터를..
- Total
- Today
- Yesterday
- ARC
- 책 추천
- RX
- swiftUI
- Algorithm
- ios
- string
- Xcode
- ReactiveX
- 애니메이션
- iOS SwiftUI
- 책
- 딥러닝
- wwdc
- 알고리즘
- SWIFT
- swift5
- 스위프트
- rxswift
- 머신러닝
- stanford SwiftUI
- Animation
- 독서
- leetcode
- Deep learning
- 책 후기
- objc
- 스위프트UI
- 문자열
- objective-c
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |