190109 완전탐색 (3) 숫자 야구

2019-01-09

완전 탐색 (3) 숫자 야구

문제 설명

숫자 야구 게임이란 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

풀이 과정
  • 가능한 모든 경우의 수 생성 - 게임 진행해서 결과가 다른 경우 break, 결과가 같으면 answer++
  • 각 세 자리의 숫자가 모두 다르다는 점을 빨리 알았으면 더 빨리 풀었을 것 같다.
import java.util.*;

class Solution {
    public static int ballCount(String answer, String target){
        int result=0;
        String[] answerArr=answer.split("");
        String[] targetArr=target.split("");
        
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(i==j) continue;
                if(answerArr[i].equals(targetArr[j])) result++;
            }
        }
        
        return result;
    }
    public static int strikeCount(String answer, String target){
        int result=0;
        String[] answerArr=answer.split("");
        String[] targetArr=target.split("");
        for(int i=0;i<3;i++){
            if(answerArr[i].equals(targetArr[i])){
                result++;
            }
        }
        return result;
    }
    public int solution(int[][] baseball) {
        int answer = 0;
        ArrayList<String> numList=new ArrayList<>();
        
        // 가능한 모든 경우의 수를 생성한다.
        for(int i=1;i<10;i++)
            for(int j=1;j<10;j++)
                for(int k=1;k<10;k++){
                    if(i==j || i==k || j==k) continue;
                    numList.add(Integer.toString(i)+Integer.toString(j)+Integer.toString(k));
                }
        
        // 제시된 게임과 비교
        for(String n : numList){
            boolean isAnswer=true;
            for(int i=0;i<baseball.length;i++){
                String tmp=Integer.toString(baseball[i][0]);
                if(strikeCount(n,tmp)!=baseball[i][1] || ballCount(n,tmp)!=baseball[i][2]){
                    isAnswer=false;
                    break;
                }
            }
            if(isAnswer)
                answer++;
        }
        return answer;
    }
}
  • equals와 ==의 차이
    • 둘 다 양쪽에 있는 내용을 boolean 타입으로 반환한다.

    • 1) 형태의 차이

      • equals(): 메소드
      • ==: 연산자
    • 2) 비교할 수 있는 대상의 차이

      • equals(): 비교하고자 하는 대상의 내용 자체를 비교

      • ==: 비교하고자 하는 대상의 주소값을 비교

      • 예시를 보면?

      • String a="aaa";
        String b=a;
        String c=new String("aaa");
              
        System.out.println(a.equals(b));
        System.out.println(a==b);
        System.out.println(a==c);		// false!!!
        System.out.println(a.equals(c));
        
      • a, b와 c는 다른 주소값을 할당받는다-> C가 문자열을 대입한 것이 아니라 new String()을 통해 새로운 문자열을 선언하였기 때문이다.