본문 바로가기

알고리즘(w.KOTLIN)/그리디(Greedy)

[백준][코틀린][12970] AB

728x90

https://www.acmicpc.net/problem/12970

 

12970번: AB

첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.

www.acmicpc.net

문제 풀이

1. 문자열을 N의 길이만큼 Char 배열에 A로 채운다.

2. 문자열의 마지막 인덱스 부터 0번째 인덱스까지 현재 인덱스(i)의 문자를 'B'로 변환하면서 다음과 같이 탐색한다.

3. 0부터 N - 2 까지 j 인덱스를 가지는 for문과 j 부터 N - 1까지 k인덱스를 가지는 이중 for문을 이용하여 조건의 쌍을 이루는 개수를 구한다.

4. 개수의 합이 K보다 크면 i 인덱스의 문자를 'B'로 변환할 수 없으므로 'A'로 다시 변환한다.

5. 개수의 합이 K와 같으면 조건의 쌍의 개수를 만족하므로 matched 를 true 로 저장한다.

6. 2 ~ 5번 과정을 모두 탐색한 뒤 matched 가 false 일 경우 -1 을 출력하고 아닐 경우 문자열을 출력한다.

코드

import java.io.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val (N, K) = br.readLine().split(" ").map { it.toInt() }

    // 문자열을 A 로 채운다.
    val S = CharArray(N) { 'A' }
    var matched = false

    // 문자열을 뒤부터 탐색한다.
    for (i in N - 1 downTo 0 step 1) {
        var sum = 0
        // i번째 문자를 'B'로 바꾼다.
        S[i] = 'B'
        // 조건을 만족하는 개수를 찾는다.
        for (j in 0 until N - 1) {
            var count = 0

            if (S[j] == 'B') continue

            for (k in j + 1 until N) {
                if (S[k] == 'B') count++
            }

            sum += count
        }

        //println("S = ${String(S)} sum = $sum")

        // 개수의 합의 K보다 크면 B로 변환하지 않는다.
        if (sum > K) {
            S[i] = 'A'
        }

        // 개수가 K와 같으면 결과를 출력한다.
        if (sum == K) {
            matched = true
            break
        }
    }

    // match된 문자열이 업으면 -1을 출력한다.
    if (matched) println(String(S))
    else println(-1)
}
728x90