Uknow's Lab.
article thumbnail

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

 

2503번: 숫자 야구

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

www.acmicpc.net

 

난이도 : 실버 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

 

[Java] 숫자 야구 게임

어렸을 적 많이 해봤던 숫자 야구 게임. ​ 입력한 값의 숫자와 정답의 숫자의 같은 자릿수의 숫자가 같다면 Strike ​ 자릿수는 다르나 같은 숫자가 있다면 Ball 이며, ​ 3 Strike 일 경우 게임을 승

uknowblog.tistory.com

 

Swing을 사용한 GUI도 있답니다.

https://uknowblog.tistory.com/202

 

[Java] 자바 Swing을 사용한 GUI 숫자 야구 게임

앞서 포스팅했던 2048과 마찬가지로, 자바를 처음 배울 당시, Swing 파트를 배울 즈음 만들었던 프로젝트 입니다. https://uknowblog.tistory.com/2 [Java] 숫자 야구 게임 어렸을 적 많이 해봤던 숫자 야구 게

uknowblog.tistory.com

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.