알고리즘/백준 문제풀이

[C++/BOJ] 백준 2503 숫자야구(완전탐색)

개발자 덕구🐾 2021. 12. 21. 17:47
728x90

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

 

2503번: 숫자 야구

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

www.acmicpc.net

 

 

음 .... 이문제를 보고 풀 방법이 생각조차 나지않아 답을 찾아보았다...ㅜㅜ

 

숫자는 1~9로 이루어졌고 서로 다른 숫자임을 알아야한다.

가장 작은 숫자는 123 가장 큰 숫자는 987이다.

 

 

123부터 987까지 for문을 돌려 s와 b의 개수가 동일한 것들만 배열의 값을 0으로 만들어 문제를 해결한다.

 

 

<정답 코드 >

#include<iostream>
using namespace std;
int n, q, s, b;
int cnt, num[1000];

int check(int i, int q, int s, int b) {
	int s_cnt = 0, b_cnt = 0;
	int i_1 = i / 100, i_2 = (i % 100) / 10, i_3 = (i % 100) % 10; //각각의 숫자로 나누기
	int q_1 = q / 100, q_2 = (q % 100) / 10, q_3 = (q % 100) % 10;

	if (i_1 == 0 || i_2 == 0 || i_3 == 0 || i_2 == i_1 || i_2 == i_3 || i_1 == i_3) return 1;
	// 0이거나 중복되는 숫자는 거름
    
    
	if (i_1 == q_1) s_cnt++;
	if (i_2 == q_2) s_cnt++;
	if (i_3 == q_3) s_cnt++;

	if (q_1 == i_2 || q_1 == i_3) b_cnt++;
	if (q_2 == i_1 || q_2 == i_3) b_cnt++;
	if (q_3 == i_2 || q_3 == i_1) b_cnt++;

	if (s_cnt == s && b_cnt == b) return 0; // 맞으면 return 0 

	return 1; // 틀리면 return 1
}
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);


	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> q >> s >> b;
		for (int i = 123; i <= 987; i++) {
			if (num[i] == 0) { //맞을 가능성이 있는 친구
				num[i] = check(i, q, s, b);
			}

		}
	}
	for (int i = 123; i <= 987; i++) {
		if (num[i] == 0) {
			cnt++;
		}
	}
	cout << cnt;
}

 

 

일단 먼저 각 숫자를 저렇게 나누는 것에서 놀랐다. 

당연히 생각할수있는건데 왜 몰랐을까

 

 

123의 경우 1을 구할때는 123 / 100을 하면 몫이 나오므로 1이다.

2는 123 %100을 하면 23이 나오고 거기에서 /10을 하면 몫은 2이다.

3의 경우 123%100으로 23을 구하고 거기에 %10을 해서 나머지 3을 구할수있다.

 

잊어버리지말고 길이가 정해진 숫자의 각 수를 구할때 이용하자

 

숫자가 들어올때마다 for문을 실행하도록 만들었다.

 예시로 주어진 429가 들어오면 123부터 987까지 돌면서 1s,1b을 만드는 숫자는 참이므로 0을 가진다. 

 

그리고 그상태에서 (가능성이 있는 수는 0인상태) 241을 돌려 1b이 나오는 숫자만 참이므로 0으로 바꾼다. 

 

만약 check가 참일때 반환값을 1으로 바꿔버리면 한번 1은 계속  1이 되므로 (if(num[i]==0) 에 안걸리니까)

check가 참일때 반환값을 0으로 만들었다.

 

 

그후 123부터 987을 돌면서 가능성이 있는 수(값이 0인 수)의 개수를 count하여 출력하면 된다. 

 

 

 

 

https://github.com/dumi33/Algorithm/blob/master/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/%EB%B8%8C%EB%A3%A8%ED%8A%B8%ED%8F%AC%EC%8A%A4/%EC%88%AB%EC%9E%90%EC%95%BC%EA%B5%AC.cpp

 

GitHub - dumi33/Algorithm: i dont know

i dont know. Contribute to dumi33/Algorithm development by creating an account on GitHub.

github.com

 

코드는 깃허브에 올려놓았다.

 

 

 

반응형