-
[스위프트:알고리즘] 이진 탐색[2 / 3]: Binary Search: 이진 탐색: 반복문, 재귀호출로 구현하기스위프트: Swift/알고리즘 : Algorithms in Swift 2018. 10. 16. 19:55
안녕하세요 ! 씩이 입니다!
저는 Swift 와 iOS 를 공부하고 연구하는 학생입니다.
같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다.
제 3자가 있다고 가정하고 설명하기 때문에 존대를 하지 않는점 이해 부탁드립니다.
공유가 미래 라고 생각합니다.
한국의 모든 개발자분들 존경합니다!
- Swift version : Swift 4.2 Swift 언어
- 참고한 것들
- 씩이 Github
- 자료구조 소스파일 있습니다.
- iOS 관련 자료들, 정보들 정리해 두었습니다.
- 스위프트로 구현한 자료구조 : DataStructures in Swift4
- Swift4 : 연결리스트 (1 / 3) : #LinkedList : #DataStructrue : #자료구조
- Swift4 : 연결리스트 (2 / 3) : #LinkedList : #값 추가하기, push, append : #값 삽입하기,insert
- Swift4 : 연결리스트 (3 / 3) : #LinkedList : #값 제거하기, pop, removeLast, remove(at: )
- [스위프트 : 자료구조] 스택: Stack: 자료구조: DataStructure: 쌓기
- [스위프트 : 자료구조] 스택 : Stack : 프로토콜 지향 스택 구현하기
- [스위프트 : 자료구조] 큐 (1 / 4): Queue: #자료구조: #배열로 구현한 큐: #배열의원리
- [스위프트 : 자료구조] 큐 (2 / 4): Queue: #자료구조: #연결리스트: #더블연결리스트: #DoublyLinkedList
- [스위프트 : 자료구조] 큐 (3 / 4): Queue: #자료구조: #Stack으로 구현: #더블스택: #DoubleStack: #제일좋음
- [스위프트 : 자료구조] 큐 (4 / 4): Queue: #자료구조: #RingBuffer: #링버퍼로 구현한 큐: #고정된배열: #마지막!!
- [스위프트 : 자료구조] 큐: Queue: 프로토콜 지향 큐 구현하기
- 스위프트: 트리: Tree: #자료구조: #깊이우선탐색: #레벨정렬탐색: #검색알고리즘: Swift4
- 스위프트: 이진 탐색 트리(1 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- 스위프트: 이진 탐색 트리(2 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- [스위프트 : 자료구조] AVL Tree: 자가 균형 트리: #balance: #트리의 높이: #rotation메소드: #성능오짐
- [스위프트:자료구조] 트라이: Trie: 문자열 찾기: 단어 찾기
- 스위프트로 구현한 알고리즘 : Algorithms in Swfit4
- [스위프트 : 알고리즘] 재귀호출 (1 / 6) : recursive: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 팩토리얼 (2 / 6) : factorial: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 거듭제곱 (3 / 6) : Power: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 피보나치 수열(4 / 6) : Fibonacci: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 하노이의 탑 (5 / 6) : Hanoi: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 최대공약수 (6 / 6) : GCD: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트:알고리즘] 이진 탐색[1 / 3]: Binary Search: 이진 탐색이 뭐야?
- [스위프트:알고리즘] 이진 탐색[2 / 3]: Binary Search: 이진 탐색: 반복문, 재귀호출로 구현하기
- [스위프트:알고리즘] 이진 탐색[3 / 3]: Binary Search: 이진 탐색: 프로토콜 지향으로 구현하기
- Swift 주제별 분류
- Swift4 : 제어 전달 명령문( Control Transfer Statement ) : #continue, #break, #return 키워드
- Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #참조타입, 값 타입 : #===
- Swift4 : 프로퍼티 : #Property : #get, set : #willSet, didSet
- Swift4 : 메소드 : #Method : #영향력 범위 : #self : #mutating : #값타입 수정
- Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이트 패턴 전처리 (1 / 2)
- Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)
- Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기
- Swift4 : 자동 참조 카운팅 : #Automatic Referece Counting : #ARC :#강한참조 : #Strong Reference Cycle : #메모리 누수
- Swift4 : 클로저: Closure: #표현방식: #왜필요해?: #효율적: #간결성: #생략
- [스위프트 : 기초] 서브스크립트 : Subscript : 지름길
이진 탐색 : Binary Search [2 / 3]
이진 탐색 구현하기 : 반복문 : 재귀호출
- 반복문으로 구현한 이진 탐색
1234567891011121314151617// 매개변수는 배열 인스턴스 array 와, 찾고자 하는 값인 valuepublic func binarySearch_for (array: [Int],for value: Int) -> Int? {var startIndex = 0 // 매개변수 배열의 첫 번째 인덱스var endIndex = array.count - 1 // 배열의 마지막 인덱스// array.endIndex 로 설정하면 array 가 동적으로 변하게 되므로 오류남을 주의while startIndex <= endIndex { // 원하는 값 못찾았을 때 종료조건let middleIndex = (startIndex + endIndex) / 2 // 중간 인덱스if value == array[middleIndex]{return middleIndex // 값 찾았을 때 종료조건} else if array[middleIndex] > value { // 왼쪽 탐색endIndex = middleIndex - 1 // 뒷쪽 인덱스 값 변화줌.} else if array[middleIndex] < value { // 오른쪽 탐색startIndex = middleIndex + 1 // 앞쪽 인덱스 값 변화줌}}return -1 // 찾고자 하는 값이 없을 때 while 문이 종료되므로 -1 반환하도록 설정}cs - 코드 분석
- 전체적으로 중간값을 찾고 찾으려는 값과 중간값을 비교하는 로직의 반복이지?
- 반복문에서 입력값의 변화는 startIndex 혹은 endIndex 를 주어서 찾으려는 값의 범위를 점점 줄여가고 있지? ( 재귀호출의 원칙이기도 함. )
- 종료조건은 2 가지 경우가 있지?
- 원하는 값을 찾았을 때 ( value == array[middleIndex] 일 때 )
- 원하는 값을 찾지 못했을 때 ( startIndex <= endIndex 에서 범위 벗어나서 반복 종료하게 됨. )
- 난 원하는 값을 찾지 못했을 때의 종료조건을 생각하지 못해서 계속 오류가 났었어.
- 재귀호출로 구현한 이진 탐색
- 반복문에서 보다 확장해서 특정 범위까지 매개변수에서 설정할 수 있도록 해보자~
1234567891011121314151617181920212223// 매개변수에는 배열과 찾고자하는 값에 더해서 찾으려는 범위까지 입력 가능.public func binarySearch_recur (array: [Int],for value: Int,startIndex: Int? = nil,endIndex: Int? = nil) -> Int? {var startIndex = startIndex ?? 0 // ?? 키워드는 startIndex 가 옵셔널이면 강제해제 하고 nil 이면 0 을 대입하라는 뜻var endIndex = endIndex ?? array.count - 1var middleIndex: Int {return (startIndex + endIndex) % 2 == 0 ? (startIndex + endIndex) / 2 : (startIndex + endIndex + 1) / 2// 특정 범위를 입력해 주었을 때 두 인덱스의 값이 홀수일 때 인덱스가 하나 작아지므로 바꿔주고}guard startIndex <= endIndex else { return -1 } // 원하는 값 못찾았을 때 종료조건if value == array[middleIndex] { // 원하는 값 찾았을 때 종료조건return middleIndex} else if array[middleIndex] > value { // 왼쪽 탐색endIndex = middleIndex - 1 // 뒷쪽 인덱스 변화줘서 재귀호출// 재구호출은 문제의 범위가 작은 방향으로 이동해야 한다는 원칙이 적용되는 부분return binarySearch_recur(array: array, for: value, startIndex: startIndex, endIndex: endIndex)} else if array[middleIndex] < value { // 오른쪽 탐색startIndex = middleIndex + 1 // 앞쪽 인덱스 변화줘서 재귀호출return binarySearch_recur(array: array, for: value, startIndex: startIndex, endIndex: endIndex)} else { return -1 }}cs - 코드 분석
- 반복문 에서와 전체적인 틀은 같아.
- 매개변수 startIndex , endIndex 초기값이 nil 로 기본값이 설정되 있음.
- 특정 인덱스를 매개변수에서 설정하지 않으면 ?? 키워드를 이용해서 startIndex 는 0, endIndex 는 array.count - 1 로 설정해줌
- 재귀호출의 원칙 모른다면 여기
- 1. 문제의 범위는 작은 방향으로 이동해야 한다. -> startIndex 와 endIndex 가 변화하면서 범위가 좁아지지?
- 2. 종료조건이 있어야 한다. -> 반복문에서와 마찬가지고 2가지 경우의 종료조건 있지?
실행과 결과'스위프트: Swift > 알고리즘 : Algorithms in Swift' 카테고리의 다른 글
댓글