문제 풀이/기타

[백준] 11399 (ATM)

interfacer_han 2024. 1. 2. 13:09

#1 알고리즘

#1-1

 

병합 정렬 (Merge Sort)

#1 알고리즘 병합 정렬의 총 비교 횟수는, 최악의 경우 nlog2n이다 #2 코드 (자바) public static void mergeSort(int[] array, int startIndex, int endIndex) { // (startIndex < endIndex)의 의미: 배열의 크기가 2이상이다. if(st

kenel.tistory.com

우선 손님 별 돈을 인출하는 시간들을 정렬해야 한다. 이 문제에서는 병합 정렬을 사용했다.

 

#1-2

1번 열 + 2번 열 + 3번 열 + ... + personCount번 열로 모든 손님들의 대기 시간 총합을 구한다.

 

#2 코드 - 코틀린

fun main() {
    val personCount = readln().toInt()
    
    val timeStrings = readln().split(" ")
    val times : Array<Int> = Array(personCount) {0}
    for(i : Int in 0..<personCount) {
        times[i] = timeStrings[i].toInt()
    }
    
    mergeSort(times, 0, times.size - 1)
    
    var timeSum = 0
    /* (1) 첫번째 손님이 인출하는데 걸리는 시간 = times[0]
     * (2) 두번째 손님이 인출하는데 걸리는 시간 = times[1] + times[0]
     * ...
     * (personCount - 1) 마지막 손님이 인출하는데 걸리는 시간 = times[personCount - 1] + ... + times[1] + times[0]
     * (1)부터 (personCount -1)까지 더한 값을 print한다.
     */
    for(i : Int in 0..<personCount) {
        timeSum += times[i] * (personCount - i)
    }
    
    println(timeSum)
}

fun mergeSort(array: Array<Int>, startIndex : Int, endIndex : Int) {

    // (startIndex < endIndex)의 의미: 배열의 크기가 2이상이다.
    if(startIndex < endIndex) {
        val midIndex = (startIndex + endIndex) / 2
        mergeSort(array, startIndex, midIndex)
        mergeSort(array, (midIndex + 1), endIndex)

        merge(array, startIndex, midIndex, endIndex)
    }
}

fun merge(array : Array<Int>, startIndex: Int, midIndex : Int, endIndex: Int) {
    // array에서 나뉜 'f'irst 부분을 순회할 인덱스 f
    var f = startIndex // f의 최댓값은 midIndex

    // array에서 나뉜 's'econd 부분을 순회할 인덱스 s
    var s = midIndex + 1 // s의 최댓값은 endIndex

    // 'T'emporary 배열 그리고 이 배열을 순회할 인덱스 t
    val T : Array<Int> = Array(endIndex - startIndex + 1) { 0 }
    var t = 0

    while(f <= midIndex && s <= endIndex) {

        if(array[f] < array[s]) {
            T[t++] = array[f++]

        } else {
            T[t++] = array[s++]
        }
    }

    // f의 영역이 남았다면 비워준다
    while(f <= midIndex) {
        T[t++] = array[f++]
    }

    // s의 영역이 남았다면 비워준다
    while(s <= endIndex) {
        T[t++] = array[s++]
    }

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

'문제 풀이 > 기타' 카테고리의 다른 글

[백준] 18110 (solved.ac)  (0) 2024.01.08
[백준] 17626 (Four Squares)  (0) 2024.01.03
[백준] 1012 (유기농 배추)  (0) 2024.01.01
[백준] 18111 (마인크래프트)  (0) 2023.12.28
[백준] 2579 (계단 오르기)  (0) 2023.12.27