Baekjoon algorithm training

[백준] 1920 (수 찾기)

interfacer_han 2023. 12. 25. 15:05

#1 알고리즘

#1-1

 

이진 탐색 (Binary search)

#1 알고리즘 #1-1 #1-2 이렇게 해서 x의 인덱스 i를 찾으면 좋겠지만, 이 x가 배열 values 어디에도 존재하지 않는 경우도 있을 것이다. 이 경우엔 어떻게 처리해야 할까? #1-3 업 앤 다운 게임은 우리나

kenel.tistory.com

시간 초과가 뜨지 않게 하기 위해서 배열에 이진 탐색을 수행한다. 
 

#1-2

 

힙 정렬 (Heap Sort)

#1 알고리즘 #1-1 힙(heap)이라는 영어 단어의 사전적 의미는 쌓아 놓은 무더기다. 그리고 이 단어는 프로그래밍에서도 사용된다. 첫째로 메모리 영역에서, 둘째로 자료구조에서다. 이 둘은 서로 다

kenel.tistory.com

이진 탐색을 수행하려면 먼저, 배열이 정렬되어있어야 한다. 나는 이 문제을 힙 정렬을 이용해 정렬했다.
 

#2 여담

문제 자체는 굉장히 간단하다. 대신 빠른 정렬과 검색 기법에 대한 지식을 요구한다.
 

#3 코드 - 코틀린

fun main() {
    val N = readln().toInt()
    val stringOfA = readln().split(" ")
    val A = Array(N) {0}
    for(i: Int in 0..<N) {
        A[i] = stringOfA[i].toInt()
    }
    val M = readln().toInt()
    val stringOfB = readln().split(" ")
    val B = Array(M) {0}
    for(i: Int in 0..<M) {
        B[i] = stringOfB[i].toInt()
    }
    
    heapSort(A, 0, A.size - 1)
    
    for(b in B) {
        if(binarySearch(A, b) == -1) {
            println(0)
        } else {
            println(1)
        }
    }
}

fun heapSort(array : Array<Int>, startIndex : Int, endIndex : Int) {
    val slicedArray = array.sliceArray(startIndex..endIndex)

    buildHeap(slicedArray)

    for(maxIndex : Int in (slicedArray.size - 1) downTo 1) {
        val temp = slicedArray[0]
        slicedArray[0] = slicedArray[maxIndex]
        slicedArray[maxIndex] = temp

        heapify(slicedArray, 0, maxIndex - 1)
    }

    slicedArray.reverse()
    for(i : Int in 0..(slicedArray.size - 1)) {
        array[startIndex + i] = slicedArray[i]
    }
}

fun heapify(array: Array<Int>, rootIndex: Int, maxIndex: Int) {
    val left = (rootIndex * 2) + 1
    val right = (rootIndex * 2) + 2
    var smaller = -1

    if(right <= maxIndex) {
        if(array[left] < array[right]) {
            smaller = left
        } else {
            smaller = right
        }

    } else if(left <= maxIndex) {
        smaller = left

    } else {
        return
    }

    if(array[smaller] < array[rootIndex]) {
        val temp = array[smaller]
        array[smaller] = array[rootIndex]
        array[rootIndex] = temp

        heapify(array, smaller, maxIndex)
    }
}

fun buildHeap(array : Array<Int>) {
    val maxIndex = array.size - 1

    for(i : Int in (maxIndex / 2) downTo 0) {
        heapify(array, i, maxIndex)
    }
}

fun binarySearch(values : Array<Int>, x : Int) : Int {
    var min = 0
    var max = values.size - 1

    while(min <= max) {
        val mid = (min + max) / 2

        // up
        if(values[mid] < x) {
            min = mid + 1
        
        // equal
        } else if(values[mid] == x) {
            return mid

        // down
        } else { // values[mid] > x
            max = mid - 1
        }
    }

    return -1
}

'Baekjoon algorithm training' 카테고리의 다른 글

[백준] 2579 (계단 오르기)  (0) 2023.12.27
[백준] 2606 (바이러스)  (0) 2023.12.26
[백준] 11723 (집합)  (0) 2023.12.21
[백준] 2108 (통계학)  (0) 2023.12.15
[백준] 10845 (큐)  (0) 2023.12.14