관리 메뉴

나만을 위한 블로그

[Algorithm] 백준 - 블랙잭 (2798) (Kotlin) 본문

알고리즘 문제 풀이/백준

[Algorithm] 백준 - 블랙잭 (2798) (Kotlin)

참깨빵위에참깨빵_ 2024. 9. 23. 18:39
728x90
반응형

 

이 문제도 브루트 포스 알고리즘을 써서 풀 수 있다. 카드 3장의 합이 M 이하면서 M에 가장 가까운 값을 찾아야 한다.

반복문 3개를 사용해서 카드를 3개씩 선택하는 경우를 구현할 수 있다.

 

fun main() {
    val (N, M) = readln().split(" ").map { it.toInt() }
    val cards = readln().split(" ").map { it.toInt() }
    var maxSum = 0

    for (i in 0 until N) {
        for (j in i + 1 until N) {
            for (k in j + 1 until N) {
                val sum = cards[i] + cards[j] + cards[k]
                if (sum <= M) {
                    maxSum = maxOf(maxSum, sum)
                }
            }
        }
    }
    println(maxSum)
}

 

입력받는 부분을 적당히 만들고 최대값을 담을 변수를 선언해둔다. 그리고 3중 반복문으로 카드 3장을 선택하는 상황을 구현한다.

어떻게 이 코드가 카드 3장을 고르는 상황을 구현하는가? 이 반복문은 아래처럼 작동한다.

 

  • 1번 반복문(i) : 1번 카드 선택
  • 2번 반복문(j) : j는 i+1부터 시작해서 중복 선택을 피해 2번 카드 선택
  • 3번 반복문(k) : k는 j+1부터 시작해서 중복 선택을 피해 3번 카드 선택

 

이렇게 되기 때문에 문제의 테스트 케이스가 주어진다면 5, 6, 7의 카드가 선택된다.

그리고 다중 반복문을 쓸 경우 가장 안쪽의 반복문부터 작동하기 때문에 3번째 카드가 9까지 모두 선택되었다면 2번 반복문이 +1 되고, 2번 반복문에서도 카드가 모두 선택됐다면 1번 반복문도 +1되어 다시 반복된다. 정확한 작동 방식은 디버깅으로 확인해 본다. 그래도 이해가 안 된다면 다중 반복문이 어떻게 작동하는지 확인하는 게 좋다.

3중 반복문을 사용하기 때문에 이 알고리즘의 시간 복잡도는 O(N^3)이 된다. 최대 100이기 때문에 최악의 경우 이 코드는 100만 번의 연산을 수행하게 된다. 그래도 충분히 빠르게 작동해서 문제를 풀 수 있다.

반응형
Comments