본문 바로가기
알고리즘/백준

[백준 2503 / 숫자 야구 / JAVA / 구현]

by KDW999 2023. 7. 27.

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

 

문제 접근

상상 속의 정답을 스트라이크와 볼로 찾아나가야 한다.

정답은 0이 될  수 없고, 서로 겹칠 수 없기 때문에 정답의 경우는 123 ~ 987 사이다.

이 사이의 수를 check 배열에 true로 처음에 지정

 

이후 123~987 사이에 정답일 수 있는 수와 입력받은 숫자 3자리를 일일이 비교하며 스트라이크와 볼인지 판단

이 때 판단한 스트라이크와 볼이 입력받은 스트라이크와 볼의 수와 같은지 비교해서 같다면 정답일 수 있는 수는 그대로 true로 남아있는다.

 

정답일 수 있는 수 모든 탐색이 끝나면 check[123~987] 사이에 true의 갯수가 가능성이므로 출력

import java.util.*;
import java.io.*;

public class Main {
    public static void main (String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st;
    	
    	int N = Integer.parseInt(br.readLine());
    	boolean[] check = new boolean[988];
    	
    	for(int i=123; i<= 987; i++) {
    		String num = String.valueOf(i);
    		
    		if(num.charAt(0) == '0' || num.charAt(1) == '0' || num.charAt(2) == '0') continue; // 숫자에 0 인됨
    		if(num.charAt(0) == num.charAt(1) || num.charAt(0) == num.charAt(2) || num.charAt(1) == num.charAt(2)) continue; // 3개의 숫자가 겹쳐도 안됨
    	    check[i] = true;	
    	}
    	
    	for(int i=0; i<N; i++) {
    		
    		st = new StringTokenizer(br.readLine());
    		int num = Integer.parseInt(st.nextToken()); // 입력 숫자
    		int s = Integer.parseInt(st.nextToken()); // 스트라이크
    		int b = Integer.parseInt(st.nextToken()); // 볼
    		
    		for(int a=123; a <= 987; a++) {
    			if(check[a]) { // 정답일 수 있는 수라면 탐색
    				
    				int sn = 0;
    				int bn = 0;
    				
    				// 입력 받은 숫자
    				for(int one=0; one<3; one++) {
    					char num_split = Integer.toString(num).charAt(one);
    					
    					// 정답일 수 있는 숫자
    					for(int two=0; two<3; two++) {
    						char a_split = Integer.toString(a).charAt(two);
    						
    						if(num_split == a_split && one == two) sn++; // 둘의 숫자가 같으면서 위치도 같다면 스트라이크
    						else if(num_split == a_split && one != two) bn++; // 둘의 숫자는 같은데 위치는 다르면 볼
    					}
    				}
    				
    				if(sn == s && bn == b) check[a] = true; // 입력받은 스트라이크와 볼의 갯수와 같아진다면 가능성 있는 수로 판별
    				else check[a] = false; // 아니라면 가능성 박탈
    			}
    		}
    	}
    	
    	int a = 0;
    	for(int i=123; i<=987; i++) {
    		if(check[i]) a++;
    	}
    	System.out.println(a);
    	
    }
}

 

댓글