본문 바로가기
데일리 프로그래밍

[프로그래머스] 숫자 야구 [Golang]

by Loper Lee 2019. 11. 29.

프로그래머스 숫자 야구 - 문제 보러 가기

입력 조건

  1. 숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.
  2. 각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다.
    • 숫자는 맞지만, 위치가 틀렸을 때는 볼
    • 숫자와 위치가 모두 맞을 때는 스트라이크
    • 숫자와 위치가 모두 틀렸을 때는 아웃

풀이

문제를 들어가보면 알겠지만 임의의 2차원 배열이 주어진뒤 이에 해당될 수 있는 숫자들이 총 몇개인지 구하는 문제다.

완전탐색을 이용해서 푸는방식을 택했다.

조건 2를 잘 생각해야 하는데 우선 숫자에 0이 들어가면 안되고, 각 자리는 중복되면 안된다.

때문에 연속된 3자리수는 123~987까지만 들어갈 수 있다.

코드

Go Version

type Baseball struct {
    dots   [3]int
    strike int
    ball   int
}
func solution(baseball [][]int) (answer int) {
    games := []Baseball{}
    for _, base := range baseball {
        games = append(games, Baseball{ [3]int{base[0] / 100,(base[0] % 100) / 10,(base[0] % 100) % 10}, base[1], base[2] })
    }
    for idx := 123; idx <= 987; idx++ {
        fir := idx / 100
        sec := (idx % 100) / 10
        thi := (idx % 100) % 10
        if fir != 0 && sec != 0 && thi != 0 && fir != sec && fir != thi && sec != thi {
            if isStrike([3]int{fir, sec, thi}, games) {
                answer++
            }
        }
    }
    return 
}
func isStrike(compare [3]int, games []Baseball) bool {
    answer := 0
    for _, game := range games {
        count := 0
        if game.dots[0] == compare[0] { count++ }
        if game.dots[1] == compare[1] { count++ }
        if game.dots[2] == compare[2] { count++ }
        if count != game.strike {
            break
        }
        count = 0
        if game.dots[0] == compare[1] || game.dots[0] == compare[2] { count++ }
        if game.dots[1] == compare[0] || game.dots[1] == compare[2] { count++ }
        if game.dots[2] == compare[0] || game.dots[2] == compare[1] { count++ }
        if count != game.ball {
            break
        }
        answer++
    }
    if answer == len(games) {
        return true
    }
    return false
}