작심 24/7

[백준] 2503번 숫자 야구 (C++, JAVA) 본문

백준

[백준] 2503번 숫자 야구 (C++, JAVA)

모닝수박 2020. 6. 8. 21:55
 

2503번: 숫자 야구

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

www.acmicpc.net

123부터 987까지의 i를 N과 비교하면서

스트라이크와 볼의 개수를 세어준 뒤

입력된 스트라이크와 볼의 개수와 비교해주고

같으면 배열[i]에 1을, 다르면 -1을 저장한다.

 

N과 i를 비교할 때 주의할 점은

세 자리가 각각 다른 숫자로 구성되어 있어야 하고, 0이 포함되면 안 된다.

이 부분만 주의해주면 된다.

 

이 코드가 무식해 보인다면

삼중 for문이나 순열로 좀 있어 보이게 짤 수 있다.

 

< C++ 코드 >

#include <iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	int num, strike, ball, res = 0;
	int arr[1000] = { 0 };
	for (int n = 0; n < N; n++) {
		cin >> num >> strike >> ball;
		for (int i = 123; i <= 987; i++) {
			if (arr[i] != -1 && i % 10 != 0 && i / 10 % 10 != 0 && i / 100 != 0 && i % 10 != i / 10 % 10 && i / 10 % 10 != i / 100 && i / 100 != i % 10) {
				int s = 0, b = 0;
				if (num % 10 == i % 10) s++;
				if (num / 10 % 10 == i / 10 % 10) s++;
				if (num / 100 == i / 100) s++;
				if (num % 10 == i / 10 % 10 || num % 10 == i / 100) b++;
				if (num / 10 % 10 == i % 10 || num / 10 % 10 == i / 100) b++;
				if (num / 100 == i / 10 % 10 || num / 100 == i % 10) b++;

				if (strike == s && ball == b) arr[i] = 1;
				else arr[i] = -1;
			}
		}
	}

	for (int i = 123; i <= 987; i++) if (arr[i] == 1) res++;

	cout << res;

	return 0;
}

 

< JAVA 코드 >

import java.util.Scanner;

public class BOJ_2503_숫자야구 {
	private static int N, cnt = 0;
	private static boolean num[] = new boolean[988]; 
	
	public static void check(int number, int strike, int ball) {
		int a = number/100, b = number%100/10, c = number%100%10;
		
		for(int i = 123; i < 988; i++) {
			if(num[i]) continue;
			int a2 = i/100, b2 = i%100/10, c2 = i%100%10, strike2 = 0, ball2 = 0;
			if(a2 == 0 || b2 == 0 || c2 == 0 || a2 == b2 || b2 == c2 || a2 == c2) { num[i] = true; continue; }
			if(a == a2) strike2++;
			if(b == b2) strike2++;
			if(c == c2) strike2++;
			if(a == b2 || a == c2) ball2++;
			if(b == a2 || b == c2) ball2++;
			if(c == b2 || c == a2) ball2++;
			if(strike != strike2 || ball != ball2) num[i] = true;
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		for(int n = 0; n < N; n++) check(sc.nextInt(), sc.nextInt(), sc.nextInt());
		for(int i = 123; i < 988; i++) if(!num[i]) cnt++;
		System.out.println(cnt);
	}
}

'백준' 카테고리의 다른 글

[백준] 1012번 유기농 배추 (C++, JAVA)  (0) 2020.06.09
[백준] 1182번 부분수열의 합  (0) 2020.06.08
[백준] 10448번 유레카 이론  (0) 2020.06.07
[백준] 2309번 일곱 난쟁이  (0) 2020.06.07
[백준] 1912번 연속합  (0) 2020.06.07
Comments