프로그래머스 문제풀이, 숫자야구

|

프로그래머스 - 숫자 야구

문제 설명

문제설명 바로가기

  • 제한사항
    • 질문의 수는 1 이상 100 이하의 자연수입니다.
    • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
  • 푼방식
    • 숫자야구에서 쓸수있는 수를 만든다. 모든 자릿수의 숫자가 겹치면 안됨, 0도 올수없음.
    • 만든 숫자와, 2차원 배열로 주어진 숫자를 통해서 값을 비교해서 스트라이크와 볼의 갯수를 구한다.
    • 볼 - 스트라이크값을 반드시 해주어야한다. 예를 들면 답이 132일 경우, 주어진 값이 123이면 1스트라이크 3ball이 아니다.
    • 1 strike, 2ball이다. contains로 구하면 이런 경우를 생각해서 볼에서 스트라이크 값을 빼야한다
    • 모든 baseball 배열에서 주어진 스트라이크 볼 값과 동일 해야함

public class Programmers42841 {
    public static void main(String[] args) {
        Programmers42841 program = new Programmers42841();
        System.out.println(program.solution(baseball));
    }

    public int solution(int[][] baseball) {
        int answer = 0;
        // 일단은 겹치지 않는 숫자를 만들자
        List<String> list = new ArrayList<>();

        int s = 0;
        int b = 0;
        int s1 = 0;
        int b1 = 0;

        for(int i = 1; i < 10; i++) {
            for(int j = 1; j < 10; j++) {
                for(int k = 1; k < 10; k++) {
                    if(i != j && j != k && i != k) {
                        list.add(String.valueOf(i * 100 + j * 10 + k));
                    }
                }
            }
        }
        for(int i=0; i<list.size(); i++){
            String temp = list.get(i);
            int cnt = 0;
            for (int j = 0; j < baseball.length && cnt < baseball.length; j++) {

                s = baseball[j][1];
                b = baseball[j][2];
                s1 = strike(temp,Integer.toString(baseball[j][0]));
                b1 = ball(temp,Integer.toString(baseball[j][0])) - s1;
                if(s1 == s && b == b1)
                    cnt++;
                // 베이스볼 같은 경우, 베이스의 볼의 숫자 모두와 일치하는 경우의 수만 정답
                // 123, 356, 327, 489를 통해서 얻은 스트라이크와 볼 갯수가 모두 일치하는 숫자만 정답..!
                // 하나라도 일치하는 경우의 수로 구할경우 정답이 나오지 않는다.. 이런 디테일이 중요함!!
                if(cnt == baseball.length)
                    answer++;
            }
        }
        return answer;
    }

    public static int strike(String num, String target) {
        int cnt = 0;
        for(int i = 0; i < target.length(); i++) {
            cnt = num.charAt(i) == target.charAt(i) ? cnt + 1 : cnt;
        }
        return cnt;
    }

    public static int ball(String num, String target) {
        int cnt = 0;
        for(int i = 0; i < target.length(); i++) {
            cnt = num.contains(String.valueOf(target.charAt(i))) ? cnt + 1 : cnt;
        }
        return cnt;
    }
}

Comments