백준온라인저지

2503번 숫자 야구

wonjjong 2018. 8. 27. 12:03

백준 온라인 저지 2503번 숫자 야구


문제 출처 : https://www.acmicpc.net/problem/2503

풀이 과정

수가 3자리 수 이고 n 번의 질문을 받는다고 하면 완전 탐색으로 해도 O(n*1000)을 넘지 않기 때문에 가장 단순한 방법인 brute force를 통해 해결했습니다.  완전 탐색을 하면서 가능한 모든 후보를 입력받은 수와 비교해 스트라이크와 볼의 갯수를 세고, 모든 질문들과 스트라이크와 볼의 갯수가 일치하면 카운팅해주는 방식입니다.  



사이트에 있는 예제를 통해 설명드리자면




324는 질문한 세자리 수와 스트라이크, 볼의 개수가 모두 일치하기 때문에 답이 될 수 있습니다.






325는 356과 489와 비교했을 때 스트라이크와 볼의 갯수가 입력받은 갯수와 일치하지 않습니다. 따라서 325는 답이 될 수 없습니다.



저는 문제를 풀면서 몇 가지 실수한 게 있었는데요. 첫 번째는 문제에서 서로 다른 세 개의 숫자로 구성된 세 자릿수를 입력받는다고 했는데 그 수에 대한(112,222,788 등) 예외 처리를 하지 않아서 틀렸었습니다. 또한 수는 1에서 9까지의 숫자로 구성되어 있다고 했으므로 값에 0이 들어가면 안되는데 그 부분을 예외 처리 못해서 틀렸습니다. 항상 느끼는 거지만 문제를 꼼꼼하게 읽는 습관을 들이는 게 알고리즘 문제 풀 때 굉장히 중요한 것 같습니다.

 

소스코드

package BOJ2503;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	static int values[], strikes[], balls[];
	static int n;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

		n = Integer.parseInt(in.readLine());
		values = new int[n];
		strikes = new int[n];
		balls = new int[n];

		// input
		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(in.readLine());
			int value = Integer.parseInt(st.nextToken());
			int strike = Integer.parseInt(st.nextToken());
			int ball = Integer.parseInt(st.nextToken());

			values[i] = value;
			strikes[i] = strike;
			balls[i] = ball;
		}

		int ans = 0;

		for (int i = 123; i <= 987; i++) {
			if (strikeAndBall(i)) {
				ans++;
			}
		}

		System.out.println(ans);
	}

	static boolean strikeAndBall(int i) {
		int hi = i / 100;
		int ti = (i % 100) / 10;
		int oi = (i % 100) % 10;

		if(hi == 0 || ti == 0 || oi == 0) return false;
		if(hi == ti || hi == oi || ti == oi) return false;
		for (int idx = 0; idx < n; idx++) {
			int v = values[idx];
			int strike = 0, ball = 0;
			int hv = v / 100;
			int tv = (v % 100) / 10;
			int ov = (v % 100) % 10;
			if (hi == hv)
				strike++;
			if (ti == tv)
				strike++;
			if (oi == ov)
				strike++;
			if (hi == tv || hi == ov)
				ball++;
			if (ti == hv || ti == ov)
				ball++;
			if (oi == hv || oi == tv)
				ball++;

			if (strike != strikes[idx] || ball != balls[idx])
				return false;

		}
		return true;
	}
}


'백준온라인저지' 카테고리의 다른 글

2420번 사파리월드  (0) 2018.09.12
2476번 주사위 게임  (0) 2018.08.31
1516번 게임 개발  (0) 2018.08.23
1946번 신입사원  (0) 2018.08.22
3053번 택시 기하학  (0) 2018.08.18