본문 바로가기
Algorithm/Programmers

Programmers - 숫자 야구 ⚾️

by HaningYa 2020. 6. 30.
728x90

 

 

코딩테스트 연습 - 숫자 야구

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

programmers.co.kr


문제

문제 설명

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

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

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

예를 들어, 아래의 경우가 있으면

  • A : 123
  • B : 1스트라이크 1볼.
  • A : 356
  • B : 1스트라이크 0볼.
  • A : 327
  • B : 2스트라이크 0볼.
  • A : 489
  • B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

 

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

입출력 예 설명

문제에 나온 예와 같습니다.


1~9 사이 숫자를 한번 사용해 123 ~ 987 까지의 경우를 모두 Stack 에 담는다.

Stack에서 하나씩 꺼내며 baseball[] 를 iterate 하며 strike 와 ball 의 숫자가 일치하는지 확인한다.

baseball.length 만큼의 모든 조건에 strike 와 ball 숫자가 일치한다면 answer++ 한다

import java.util.*;
class Solution {
    String[] nums = {"1","2","3","4","5","6","7","8","9"};
    Stack<String> st = new Stack();
    public int solution(int[][] baseball) {
        int answer = 0;
        
        //3자리 수를 모두 만든다.
        //{1~9까지 중복X 순서O}
        int n = nums.length;
        int r = 3;
        LinkedList<Integer> perArr = new LinkedList();
        int[] checkArr = new int[n];
        permutation(n,r,perArr,checkArr);
        while(st.isEmpty() == false){
            String str = st.peek();
            String[] num = st.pop().split("");

            boolean result = true;
            for(int i = 0 ; i < baseball.length ; i++){
                int[] item = baseball[i];
                String[] compareNum = String.valueOf(item[0]).split("");
                int strike = item[1];
                int ball = item[2];
                
                //num 과 compareNum을 비교하여 strike와 ball 의 갯수가 맞을 경우 true
                int comStrike = 0;
         
                for(int j = 0 ; j < 3 ; j++){
                    if(num[j].equals(compareNum[j])) comStrike++;
                }
                
                int comBall = 0;
                for(int j = 0 ; j < 3 ; j++){
                    if(str.contains(compareNum[j])) comBall++;
                }
                comBall = comBall - comStrike;
         
                if(ball == comBall && strike == comStrike){
                }else{
                    result = false;
                }
            
            }//loop of i
            // 
            if(result) answer++;
            
        }
        
    
        
        return answer;
    }
    public void permutation(int n, int r, LinkedList<Integer> perArr, int[] checkArr){
        
        if(r==perArr.size()){
            StringBuilder builder = new StringBuilder();
            for(int i : perArr){
                builder.append(nums[i]);
            }
            st.push(new String(builder));
            return;
        }
        for(int i = 0 ; i < n ; i++){
            if(checkArr[i] == 0){
                perArr.add(i);
                checkArr[i] = 1;
                permutation(n,r,perArr,checkArr);
                perArr.removeLast();
                checkArr[i] = 0;
            }
        }
    }
}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers - 타겟 넘버  (0) 2020.08.03
Programmers - 카펫  (0) 2020.06.30
Programmers - 소수찾기(완전탐색)  (0) 2020.06.30
Programmers - ⚖️가장 큰 수  (0) 2020.06.27
Programmers - 라면공장🍜  (0) 2020.06.26

댓글