문제 링크
문제 해설
번역이 되지 않은 문제라 그런지 문제를 푸는 시도조차 한 사람들이 거의 없는 문제이다.
대충 해석을 해보면 플레이어가 추측한 guess와 target이 주어졌을 때, 아래의 조건에 따라 black, grey, white 점수가 1씩 증가한다. i는 현재 인덱스를 뜻한다.
- black : guess[i]와 target[i] 일치할 경우.
- grey : guess[i]와 target[i - 1] 또는 target[i + 1]과 일치할 경우. 이 때, guess[i - 1]부터 guess[i + 1]은 black 점수가 아니어야 한다.
- white : black과 grey가 아니면서 guess[i]가 target의 어딘가에 존재하는 경우.
조건을 보면 grey는 black이 아니면서 조건을 만족해야하고 white는 black과 grey가 아니면서 조건을 만족해야 한다. 따라서 black 조건을 탐색하여 black인 부분을 제외 → grey 조건을 탐색하여 grey인 부분을 제외 → white 조건을 탐색하여 최종 결과를 출력하는 방식으로 구현하였다.
Code
fun main() = with(System.`in`.bufferedReader()) {
val bw = System.out.bufferedWriter()
var s: String
while (readLine().also { s = it } != "#") {
var (b, g, w) = IntArray(3) // black, grey, white를 0으로 초기화
val (p, t) = s.split(" ") // p는 guess, t는 target
var pCheck = StringBuilder(p) // p가 black, grey, white로 체크됐는지 확인
var tCheck = StringBuilder(t) // t가 black, grey, white로 체크됐는지 확인
// black
// black 점수로 체크되는 부분을 *로 치환
for (i in p.indices) {
if (pCheck[i] == tCheck[i]) {
pCheck[i] = '*'
tCheck[i] = '*'
b++
}
}
// 모든 문자가 black으로 체크되면 이후의 계산은 불필요하므로 다음 케이스로 넘어감
if (!pCheck.contains("[^*]".toRegex())) {
bw.write("${t}: $b black, $g grey, $w white\n")
continue
}
// outofindex 방지
pCheck = StringBuilder(" $pCheck ")
tCheck = StringBuilder(" $tCheck ")
// grey
// grey 점수로 체크되는 부분을 *로 치환
for (i in 1 until pCheck.lastIndex) {
if (tCheck[i] != '*' && pCheck[i - 1] == tCheck[i]) {
pCheck[i - 1] = '*'
tCheck[i] = '*'
g++
}
if (tCheck[i] != '*' && pCheck[i + 1] == tCheck[i]) {
pCheck[i + 1] = '*'
tCheck[i] = '*'
g++
}
}
// 모든 문자가 black or grey로 체크되면 이후의 계산은 불필요하므로 다음 케이스로 넘어감
if (!pCheck.contains("[^*\\s]".toRegex())) {
bw.write("${t}: $b black, $g grey, $w white\n")
continue
}
// outofindex 방지를 위해 넣은 공백 제거
pCheck = StringBuilder(pCheck.toString().trim())
tCheck = StringBuilder(tCheck.toString().trim())
// white
// black과 grey를 체크하고 남은 문자들 중 white 탐색
for (i in pCheck.indices) {
if (pCheck[i] != '*' && tCheck.contains(p[i])) {
w++
}
}
// 결과 출력
bw.write("${t}: $b black, $g grey, $w white\n")
}
bw.close()
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 1010 : 다리 놓기 (1) | 2022.11.24 |
---|---|
[Kotlin] 백준 1094 : 막대기 (0) | 2022.11.23 |
[Kotlin] 백준 1308 : D-Day (0) | 2022.11.23 |
[Kotlin] 백준 1251 : 단어 나누기 (0) | 2022.11.23 |
[Kotlin] 백준 1181 : 단어 정렬 (0) | 2022.11.22 |
댓글