algorithm/프로그래머스

[프로그래머스] 숫자 야구 (07.20)

자바왕세자 2020. 7. 20. 23:29

문제

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

 

접근법

완전 탐색이라는 분류에 맞게 가능한 모든 경우의 수를 체크했다.

범위가 세 자리 수로 많지 않으므로 123부터 897까지 직접 확인했다.

문제에서 서로 다른 세개의 수라고 했으므로 세 숫자는 모두 달라야 하고 1~9까지의 범위라고 했으므로 0이 들어가면 안되는 조건을 고려하여 진행하였다.

 

코드

import java.util.*;


class Solution {
    public int solution(int[][] baseball) {

        Set<String> set = new HashSet<>();

        for(int i=123; i<=987; i++){
            boolean isTrue = false;
            String num = String.valueOf(i);
            String[] numArr = num.split("");

            if(numArr[0].equals("0") || numArr[1].equals("0") || numArr[2].equals("0"))
                continue;

            if(numArr[0].equals(numArr[1]) || numArr[1].equals(numArr[2]) || numArr[2].equals(numArr[0]))
                continue;

            for(int j=0;j<baseball.length;j++){
                if(!checkStrikeAndBall(num, String.valueOf(baseball[j][0]), baseball[j][1], baseball[j][2])){
                    isTrue = true;
                    break;
                }
            }
            if(!isTrue)
                set.add(num);
        }

        return set.size();
    }

    public boolean checkStrikeAndBall(String num1, String num2, int strike, int ball){
        String[] num1Arr = num1.split("");
        String[] num2Arr = num2.split("");

        for(int i=0;i<3;i++){
            if(num1Arr[i].equals(num2Arr[i]))
                strike --;
        }

        List<String> list = Arrays.asList(num2Arr);
        for(int i=0;i<3;i++){
            System.out.println(list.indexOf(num1Arr[i]));
            if(list.contains(num1Arr[i]) && list.indexOf(num1Arr[i]) != i){
                ball--;
            }
        }

        if(strike == 0 && ball == 0)
            return true;
        return false;
    }
}