[문제풀이] 숫자 야구

업데이트:

문제 링크 : 숫자 야구

풀이 시간 : 15분

1. 문제 풀이

완전 탐색을 하면서 조건에 맞는 조합의 수를 찾는다.

1) 각 자리가 서로 겹치지 않는 조합을 찾는다(3중 for문)

2) 그 조합이 입력으로 들어온 조건에 부합하는지 판별

3) 부합하면 answer를 증가한다

2. 소스 코드

    static public int solution(int[][] baseball) {
		int answer = 0;
		// 3자리라서 3중 for문을 이용해서 완전 탐색을 진행 
		for (int i = 1; i <= 9; i++) {
			for (int j = 1; j <= 9; j++) {
				// 중복이 안되기 때문
				if (j != i) {
					for (int k = 1; k <= 9; k++) {
						// 중복이 안되기 때문
						if(k!=j && k!=i) {
							boolean flag = true;
							// 입력을 비교하여 조건에 부합하는지 찾는다
							for (int l = 0; l < baseball.length; l++) {
								int strike = 0;
								int ball = 0;
								int temp = baseball[l][0];
								int[] num = new int[3];
								num[0] = temp/100;
								temp =temp%100;
								num[1] = temp/10;
								temp = temp% 10;
								num[2] = temp;
								// 첫번째 자리
								if(num[0] ==i) {
									strike++;
								}else if(i==num[1] || i==num[2]) {
									ball++;
								}
								// 두번째 자리
								if(num[1] ==j) {
									strike++;
								}else if(j==num[0] || j==num[2]) {
									ball++;
								}
								// 세번째 자리
								if(num[2] ==k) {
									strike++;
								}else if(k==num[1] || k==num[0]) {
									ball++;
								}
								// 입력이랑 하나라도 틀리면 불가능 하기 때문
								if(strike != baseball[l][1] || ball != baseball[l][2]) {
									flag = false;
									break;
								}
							}
							if(flag) {
								answer++;
							}
						}
					}
				}
			}
		}
		return answer;
	}

3. 후기

조건이 3자리 뿐이라서 완전 탐색으로 찾을 수 있는 문제다

strike와 ball의 판단하는 것이 관건이다

각 자리의 숫자가 중복이 안되기 때문에

각 자리별로 strike인지 확인하고 아니면 ball인지 판별했다.