글 작성자: beaniejoy

프로그래머스 코딩테스트 연습 - 완전탐색 / 숫자 야구 (https://programmers.co.kr/learn/courses/30/lessons/42841)

 

코딩테스트 연습 - 숫자 야구 | 프로그래머스

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

programmers.co.kr

어렸을적 친구들과 많이 해보았던 베이스볼 게임입니다. 완전탐색에 맞게 1 ~ 9 중 순서를 고려한 3개를 뽑는 순열 알고리즘이 필요합니다. 전에 완전탐색 - 소수찾기에서 사용했던 순열 알고리즘을 그대로 이용해서 코드를 구성해보았습니다. 

 

check 메서드에서 baseball 2차원 integer 배열에 들어가 있는 질문한 숫자, 스트라이크의 수, 볼의 수와 일치하는지 아닌지에 따라 정답 후보를 담는 HashSet에 추가하도록 코드를 작성해보았습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.util.HashSet;
import java.util.Set;
 
class Solution {
    Set<Integer> rightSet = new HashSet<>();
    private int[][] baseball;
    
    public int solution(int[][] baseball) {
        int answer = 0;
        this.baseball = baseball;
        int[] arr = {123456789};
        
        perm(arr, 03);
        answer = rightSet.size();
        
        return answer;
    }
    
    public void perm(int[] arr, int depth, int k) {
        if (depth == k) { 
            returnNumber(arr, k);
            return;
        } else {
            for (int i = depth; i < arr.length; i++) {
                swap(arr, i, depth);
                perm(arr, depth + 1, k);
                swap(arr, i, depth);
            }
        }
    }
 
    public void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 
    public void returnNumber(int[] arr, int k) {
        int resultNumber = 0;
        for (int i = 0; i < k; i++) {
            resultNumber += arr[i] * Math.pow(10,k-1-i);
        }
        check(resultNumber);
    }
 
    private void check(int resultNumber) {
        boolean isRight = true;
        int strike = 0;
        int ball = 0;
        String numbToStr = Integer.toString(resultNumber);
        
        for(int i = 0; i < baseball.length; i++){
            String tryBall = Integer.toString(baseball[i][0]);
            for(int j = 0; j < 3; j++){
                char chr = tryBall.charAt(j);
                if(chr == numbToStr.charAt(j)){
                    strike++;
                } else{
                    if(numbToStr.contains(Character.toString(chr))){
                        ball++;
                    }
                }
            }
            if(strike != baseball[i][1|| ball != baseball[i][2]){
                isRight = false;
                break;
            }
            strike = 0;
            ball = 0;
        }
       
        if (isRight) {
            rightSet.add(resultNumber);
        }
    }
}