https://www.acmicpc.net/problem/2503
난이도 : 실버 3
태그 : 구현, 브루트포스
설명
어릴때 많이 해봤던 숫자야구 게임입니다.
프로그래밍 언어를 처음 배울 때 구현 능력 향상 예제로도 많이 접하곤 하죠.
이번 문제는 특이하게도, 숫자와 해당 숫자의 strike, ball이 주어졌을 때,
가능한 정답의 개수를 출력하면 됩니다.
그냥 간단하게, 123부터 시작하여 987 까지(중복이 허용되지 않으므로),
숫자, strike, ball 셋이 모두 가능하다면 카운팅하면 됩니다.
소스코드
data class Baseball(val num: String, val strike: Int, val ball: Int)
fun main() = with(System.`in`.bufferedReader()) {
var cnt = 0
val baseballs = mutableListOf<Baseball>()
repeat(readLine().toInt()) {
val (num, strike, ball) = readLine().split(" ").map { it.toInt() }
baseballs.add(Baseball(num.toString(), strike, ball))
}
outer@ for (i in 123..987) {
val num = i.toString()
if (num.length != num.toSet().size || num.contains('0')) continue
for (j in 0 until baseballs.size) {
var strike = 0
var ball = 0
for (k in 0 until 3) {
if (num[k] == baseballs[j].num[k]) strike++
else if (num[k] in baseballs[j].num) ball++
}
if (strike != baseballs[j].strike || ball != baseballs[j].ball) continue@outer
}
cnt++
}
println(cnt)
}
숫자의 범위는 1~9까지, 중복을 허용하지 않으므로
if (num.length != num.toSet().size || num.contains('0')) continue를 넣어줬습니다.
기존 길이가 3인 문자열을 중복을 허용하지 않는 Set 자료구조로 만들었을 때,
Set의 길이와 원본 문자열의 길이가 달라졌다면 중복이 있는 것으로 볼 수 있습니다.
if (num[k] == baseballs[j].num[k]) strike++
else if (num[k] in baseballs[j].num) ball++
숫자가 같으면서, 위치까지 같다면 strike,
숫자가 같으면서, 위치가 다르다면 ball 입니다.
if문에서 숫자+위치 모두 같을 경우를 미리 체크했기에,
else if문에서 그냥 3자리 숫자 중 같은 숫자가 있는지만 체크하면 됩니다.
후기
저도 자바를 처음 배울 때, 숫자 야구 게임을 만들어본 적이 있는데, 감회가 새롭네요.
https://uknowblog.tistory.com/2
Swing을 사용한 GUI도 있답니다.
https://uknowblog.tistory.com/202
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 1449번] [Kotlin] 수리공 항승 (0) | 2023.12.01 |
---|---|
[백준 14719번] [Kotlin] 빗물 (1) | 2023.11.30 |
[백준 11508번] [Kotlin] 2+1 세일 (0) | 2023.11.24 |
[백준 16496번] [Kotlin] 큰 수 만들기 (0) | 2023.11.24 |
[백준 1181번] [Kotlin] 단어 정렬 (2) | 2023.11.20 |