[백준] 2503번: 숫자 야구 - Kotlin[코틀린]

2024. 1. 29. 22:06·알고리즘/Baekjoon

문제

 

 

2503번: 숫자 야구

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

www.acmicpc.net

 


풀이

 

 숫자야구는 일반적으로 세 자리나 네 자리의 숫자를 임의로 설정하여 상대방의 숫자를 맞추는 게임이다. 숫자를 맞추기 위해서는 서로에게 상대방의 숫자를 불러 결과를 확인한다. 결과는 숫자와 위치가 일치하면 스트라이크, 숫자는 맞지만 위치가 다르다면 볼로 판정하고 상대방에게 알려준다. 예를 들어 임의의 수가 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
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 1992번: 쿼드트리 - Kotlin[코틀린]
  • [백준] 2630번: 색종이 만들기 - Kotlin[코틀린]
  • [백준] 11729번: 하노이 탑 이동 순서 - Kotlin[코틀린]
  • [백준] 11000번: 강의실 배정 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      피보나치
      이분 탐색
      분리집합
      브루트포스
      구현
      분할 정복
      누적 합
      BFS
      모듈러 곱셈 역원
      문자열
      정렬
      DP
      그래프이론
      에라토스테네스의 체
      그리디
      dfs
      유니온파인드
      스택
      MST
      큐
      소수 판정
      티스토리
      수학
      백트래킹
      우선순위 큐
      프림
      크루스칼
      투 포인터
      재귀
      그래프 탐색
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 2503번: 숫자 야구 - Kotlin[코틀린]
    상단으로

    티스토리툴바