728x90
문제
https://www.acmicpc.net/problem/2503
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트...
www.acmicpc.net
해설
문제에 주어진 조건을 보자.
- 1에서 9까지의 "서로 다른 숫자 세 개"로 구성된 세 자리 수
- 즉, 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
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 1149번: RGB거리 (0) | 2023.02.08 |
---|---|
[백준/BOJ] 1213번: 팰린드롬 만들기 (0) | 2023.01.17 |
[백준/BOJ] 1937번: 욕심쟁이 판다 (0) | 2023.01.11 |
[백준/BOJ] 9466번: 텀 프로젝트 (0) | 2023.01.10 |
[백준/BOJ] 10451번: 순열 사이클 (1) | 2023.01.09 |
댓글