본문 바로가기
Algorithm

[알고리즘] 프로그래머스-숫자 야구 (완전탐색)

by byeongoo 2020. 7. 26.

1. 문제

2. 나의 코드

순열과 해시맵, 완전 탐색을 이용해서 풀었다. 우선 1~9까지의 서로 다른 3자리 수를 구하는 permutation 메소드를 구현하였다. 그리고 구한 순열의 숫자와 현재 baseball에 들어온 수들과 전부 비교하여 스트라이크 수와 볼 수를 전부다 만족하는 수이면 해시맵에 그 키에 대해서 1씩 더해주었다. 결과적으로 baseball의 길이와 해시맵에 들어가 있는값이 같다면 케이스를 모두 만족하는 수이므로 answer를 1씩 증가 시켜주는 방식으로 답을 구했다.

import java.util.*;

class Solution {
    
    private static Map<String, Integer> map; 
    
    public void permutation(boolean[] visited, int depth, String answer){
        
        if(depth == 3){
            if(answer.length() == 3)
                map.put(answer, 0);
            return;
        }
        
        for(int i=1;i<=9;i++){
            
            if(visited[i] == true){
                continue;
            }
            
            visited[i] = true;
            permutation(visited, depth+1,  answer +String.valueOf(i));
            visited[i] = false;
            permutation(visited, depth+1, answer);
        }
    }
    
    public void countAnswer(int[] base){

        for(String key : map.keySet()){
            
            int ball = 0;
            int strike = 0;
            String baseValue = Integer.toString(base[0]);
            
            //스트라이크 검사
            for(int i = 0;i<3;i++){
                if(key.charAt(i) == baseValue.charAt(i)){
                    strike+=1;
                }
            }
            //볼 검사
            for(int i = 0;i<3;i++){
                for(int j=0;j<3;j++){
                    if(i!=j && key.charAt(i) == baseValue.charAt(j)){
                        ball+=1;
                    }
                }
            }
            
            //스트라이크 수, 볼 수 맞으면 정답으로 인정
            if(strike == base[1] && ball == base[2]){
                map.put(key, map.get(key) + 1);
            }
        }
    }
    
    public int solution(int[][] baseball) {
        int answer = 0;
        
        boolean[] visited = new boolean[10];
        map = new HashMap<>();
        
        //서로 다른 3자리수로 순열 구함
        permutation(visited, 0, "");
        
        for(int[] base : baseball){
            countAnswer(base);
        }

        int len = baseball.length;
        for(String key : map.keySet()){
            if(len == map.get(key))
                answer++;
        }
        
        return answer;
    }
}