문제
풀이
숫자야구는 일반적으로 세 자리나 네 자리의 숫자를 임의로 설정하여 상대방의 숫자를 맞추는 게임이다. 숫자를 맞추기 위해서는 서로에게 상대방의 숫자를 불러 결과를 확인한다. 결과는 숫자와 위치가 일치하면 스트라이크, 숫자는 맞지만 위치가 다르다면 볼로 판정하고 상대방에게 알려준다. 예를 들어 임의의 수가 456 이고 확인하는 수가 469 인 경우 1스트라이크 1볼이라고 상대방에게 알려준다. 만약 숫자가 하나도 맞지않는다면 아웃으로 처리하고, 3아웃이면 패배한다. 하지만 이번 문제에서는 경우의 수를 찾는 것이므로 아웃은 따로 처리하지 않는다.
결과에 따른 경우의 수를 찾기 위해 숫자, 스트라이크, 볼을 저장하는 NumberBaseBall이라는 데이터 클래스를 생성하고, 입력받은 값을 저장해주었다. 경우의 수를 찾기 위한 방법으로 100부터 999까지의 숫자를 모두 확인해보는 방법도 있지만, 입력받은 수의 각 자리의 수는 중복되지 않기 때문에 조합을 이용하여 확인할 수를 정하였다.
조합은 백트래킹을 활용하여 숫자를 하나씩 선택하는 방법으로 구현하고 세 자리를 선택하면 해당 숫자가 주어진 결과에 만족하는 지를 확인한다.
확인하는 방법은 입력받은 결과와 확인하는 수를 비교하여 스트라이크와 볼을 계산하고 모든 결과값과 일치한다면 가능한 경우의 수라고 판단하여 세어주면 된다.
코드
import java.util.*
data class NumberBaseBall(val num: String, val strike: Int, val ball: Int)
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val num = br.readLine().toInt()
val arr = Array(num){ NumberBaseBall("", 0, 0) }
repeat(num) {
with(StringTokenizer(br.readLine())) {
arr[it] = NumberBaseBall(nextToken(), nextToken().toInt(), nextToken().toInt())
}
}
var cnt = 0
val visited = BooleanArray(9)
fun check(num: String): Boolean { // 주어진 숫자가 가능한 경우의 수인지 확인하는 함수
arr.forEach {
var strike = 0
var ball = 0
for(i in 0 until 3) {
if(it.num.contains(num[i])) ball++
if(it.num[i] == num[i]) {
strike++
ball--
}
}
if(it.strike != strike || it.ball != ball) return false
}
return true
}
fun comb(num: String) { // 숫자 조합을 생성하는 함수
if(num.length == 3) {
if(check(num)) cnt++
return
}
for(i in 1 .. 9) {
if(visited[i-1]) continue
visited[i-1] = true
comb(num+i)
visited[i-1] = false
}
}
for(i in 1 .. 9) { // 1부터 9까지의 숫자로 시작하는 모든 경우의 수 생성
if(visited[i-1]) continue
visited[i-1] = true
comb("$i")
visited[i-1] = false
}
bw.write("$cnt")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1992번: 쿼드트리 - Kotlin[코틀린] (0) | 2024.02.06 |
---|---|
[백준] 2630번: 색종이 만들기 - Kotlin[코틀린] (0) | 2024.02.05 |
[백준] 11729번: 하노이 탑 이동 순서 - Kotlin[코틀린] (0) | 2024.01.25 |
[백준] 11000번: 강의실 배정 - Kotlin[코틀린] (0) | 2024.01.22 |
[백준] 5567번: 결혼식 - Kotlin[코틀린] (0) | 2024.01.21 |