PS(Problem Solving)/BOJ

[백준/BOJ] 2503번: 숫자 야구

JunsuKim 2023. 1. 16.
728x90

문제

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

해설

문제에 주어진 조건을 보자.

  1. 1에서 9까지의 "서로 다른 숫자 세 개"로 구성된 세 자리 수
  2. 즉, 0도 포함되지 않는다는 것이다.

따라서 123부터 987까지의 숫자 중 답이 될 수 있는 경우가 있다는 것이 된다.

단순하게 123부터 987까지를 반복문을 통해 모두 확인하며, 입력한 수에 대해 모두 만족한다면 답이 될 수 있는 경우가 된다.

즉, strike의 개수와 ball의 개수가 영수가 말한 갯수와 모두 일치할 때 갯수를 증가시켜주면 된다.

코드를 보면 쉽게 이해가 가능할 것이다.

코드

private val list = mutableListOf<Triple<Int, Int, Int>>()

fun main() = with(System.`in`.bufferedReader()) {
    repeat(readLine().toInt()) {
        val (num, strike, ball) = readLine().split(" ").map { it.toInt() }
        list.add(Triple(num, strike, ball))
    }
    println(findAnswerNum())
}

private fun findAnswerNum(): Int {
    var resultCase = 0

    for(i in 123 until 988) {
        var canAnswer = 0

        if(!checkNum(i.toString())) continue

        list.forEach { curr ->
            val strike = strikeCnt(curr.first, i)
            val ball = ballCnt(curr.first, i)

            if(curr.second == strike && curr.third == ball) canAnswer++
        }

        if(canAnswer == list.size) resultCase++
    }

    return resultCase
}

private fun checkNum(n: String): Boolean {
    if(n[0] == n[1]) return false
    if(n[1] == n[2]) return false
    if(n[0] == n[2]) return false
    if(n.contains('0')) return false
    return true
}

private fun strikeCnt(n1: Int, n2: Int): Int {
    val userNum = n1.toString()
    val caseNum = n2.toString()
    var cnt = 0

    repeat(3) {
        if(userNum[it] == caseNum[it]) cnt++
    }

    return cnt
}

private fun ballCnt(n1: Int, n2: Int): Int {
    val userNum = n1.toString()
    val caseNum = n2.toString()
    var cnt = 0

    repeat(3) { i ->
        repeat(3) { j ->
            if(i != j && userNum[i] == caseNum[j]) cnt++
        }
    }

    return cnt
}
728x90

댓글