Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
123 lines (96 loc) · 2.94 KB

File metadata and controls

123 lines (96 loc) · 2.94 KB
Copy raw file
Download raw file
Outline
Edit and raw actions

필수 알고리즘 - 이진탐색 (Binary Search)

어떤 값을 찾을 때 정렬의 특징을 이용해 빨리 찾음

  • 정렬이 되어있을 경우, 어떤 값을 찾을 때 ::: O(N) ->> O(lgN)
  • 처음부터 생각하기 어려움..
  • 시간 복잡도를 따져보고 시간이 초과하는 거라면 이진탐색을 떠올리도록 한다.

시간 복잡도

N개의 수 정렬 ::: O(NlgN) M개의 수 이진 탐색::: O(M * lgN)

이진탐색의 느낌

N개의 숫자가 있을 때,A라는 숫자를 찾으려면

만약 전체를 계산하는 거라면 for 0..<n 의 비교를 하게 되는 것이다.

이진 탐색

  • 전체의 배열을 정렬
  • 전체를 반으로 분할하여 해당 위치의 숫자와 찾을 숫자 A와 비교한다.
  • 만약 못찾으면 나머지 부분에서 또 절반을 나누어서 숫자 A와 비교한다.

다른 예시

1,2,3,4 라는 4개의 수가 있고 거기서 3을 찾으려고 한다.

가장 먼저 떠올릴 수 있는 for문으로 4개를 모두 탐색하면 O(N) = 4 먼저 절반을 나누어 작은 수가 2가 나오고, 2보다 3이 크기 때문에 다음 남은 우측을 또 반을 쪼개서 작은 수가 3인것을 찾음 O(lgN) = 2



코드로 보는 예제

두개의 입력을 받을 예정이다. 찾을 숫자는 4이고 1부터 6까지 총 6개의 숫자의 배열에서 4를 찾는 과정이다.

let input2 = """
            4
            1 2 3 4 5 6
            """


let input3 = input2.split(separator: "\n")
let target = Int(input3[0])!
let arr = input3[1].split(separator: " ").map{ Int(String($0))!}
let (st, en) = (arr.first!, arr.last!)
binarySearch(st, en, target)

func binarySearch(_ start: Int, _ end: Int, _ target: Int) {
    if start == end {
        print(start)
        return
    }
    
    let mid = (start + end) / 2
    if arr[mid] < target {
        binarySearch(mid+1, end, target)
    } else {
        binarySearch(start, mid, target)
    }
}

이 부분에서 binarySearch의 기본 골조는 아래와 같다.

func binarySearch(_ start: Int, _ end: Int, _ target: Int) {
    if start == end {
        print(start)
        return
    }
    
    let mid = (start + end) / 2
    if arr[mid] < target {
        binarySearch(mid+1, end, target)
    } else {
        binarySearch(start, mid, target)
    }
}

기본 문제

백준 1920

let input3 = """
10 4790
1
5
10
50
100
500
1000
5000
10000
50000
"""

let totalArr = input3.split(separator: "\n")
//let firstLine = totalArr[0].split(separator: " ").map{ Int($0)!}

let firstLine = readLine()!.split(separator: " ").map{ Int($0)!}
var (coinRow, target) = (firstLine[0], firstLine[1])
//var coins = totalArr[1...].map{Int($0)!}.sorted(by: >)
var coins = [Int]()
for _ in (0..<coinRow) {
    let coin = Int(readLine()!)!
    coins.append(coin)
}
coins.sort(by: >)

var count = 0
for coin in coins {
    count += target / coin
    target = target % coin
}
print(count)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.