본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1811 : Adjacent Mastermind

by 개발하는 곰돌이 2022. 11. 22.

 

문제 링크

 

1811번: Adjacent Mastermind

Mastermind is a game played with a supply of pegs of various colours, or in the absence of proper equipment, pen and paper (or a computer!) using letters A, B, C, etc, as ‘pegs’ with the different letters representing different colours. One player choo

www.acmicpc.net



문제 해설

번역이 되지 않은 문제라 그런지 문제를 푸는 시도조차 한 사람들이 거의 없는 문제이다.

대충 해석을 해보면 플레이어가 추측한 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

댓글