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
'알고리즘(w.KOTLIN) > 그리디(Greedy)' 카테고리의 다른 글
[백준][코틀린][12904] A와 B (0) | 2023.06.07 |
---|---|
[백준][코틀린][1783] 병든 나이트 (0) | 2023.05.29 |
[백준][코틀린][10610] 30 (0) | 2023.05.19 |
[백준][코틀린][2875] 대회 or 인턴 (0) | 2023.05.18 |
[백준][코틀린][1744] 수 묶기 (0) | 2023.05.15 |