본문 바로가기

Algorithm

[프로그래머스 - 완전탐색] 숫자야구

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42841


문제 설명

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

 

  • 숫자는 맞지만, 위치가 틀렸을 때는 볼
  • 숫자와 위치가 모두 맞을 때는 스트라이크
  • 숫자와 위치가 모두 틀렸을 때는 아웃

제한사항

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

풀이 순서

  1. 123 ~ 987까지 가능한 3자리 모든 경우의 수 반복 (제외 1) 0이 포함되는 숫자-100, 제외 2) 서로 중복되는 수-111)
  2. 위 범위 숫자중 제외1), 제외2) 조건에 만족되는 숫자 제외
  3. baseball 배열의 세 자리의 수(var: cmp), 스트라이크의 수(var: strike), 볼의 수(var: ball) 체크
class Solution {
    public int solution(int[][] baseball) {
        int answer = 0;
        // 풀이 순서 1: 모든 세자리 경우의 수
        for(int i=123; i<988; i++){ 
            String tmp = i+"";
            
            // 풀이 순서 2: 제외 조건1), 2)
            if(tmp.contains("0")){
                continue;
            }
            if((tmp.charAt(0) == tmp.charAt(1)) || (tmp.charAt(0) == tmp.charAt(2)) || 
                (tmp.charAt(1) == tmp.charAt(2))){
                continue;
            }
            
            // 풀이 순서 3: baseball의 세자리수(cmp)와 체크하고자 하는 세자리수(tmp)
            // 				strike수와 st_cnt, ball수와 b_cnt 개수 비교
            boolean flag = true;
            for (int j=0; j<baseball.length; j++){
                
                int strike = baseball[j][1];
                int ball = baseball[j][2];
                String cmp = baseball[j][0]+"";
                
                int st_cnt = 0;
                int b_cnt = 0;
                
                for(int k=0; k<3; k++){
                    if(cmp.charAt(k) == tmp.charAt(k)){
                        st_cnt += 1;
                    } 
                    
                    if(cmp.charAt(k) != tmp.charAt(k)){
                        if(tmp.contains(cmp.charAt(k)+"")){
                            b_cnt +=1;
                        }
                    }
                }
          		if(ball != b_cnt || strike != st_cnt){
                        flag = false;
                        break;
                }
            }
            if(flag){
                answer += 1;
            }            
            
        }
        
        return answer;
    }
}