본문으로 바로가기

[백준 2503] 숫자 야구

category PS/백준 문제풀이 2019. 8. 25. 19:55
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

www.acmicpc.net

 

프로그래머스에서 푼 문제와 동일하다.

처음에 계속 틀렸다고 나오길래 다시보니 0은 포함하지 않는다.

 

#include <string>
#include <vector>
#include <set>
#include <iostream>

using namespace std;

set<int> possibles;

void makePossible(string num, int cnt, vector<bool>& visited) {
	if (cnt == 3) {
		possibles.insert(atoi(num.c_str()));
		return;
	}

	for (int i = 1; i < 10; i++) {
		if (!visited[i]) {
			visited[i] = true;
			makePossible(num + to_string(i), cnt + 1, visited);
			visited[i] = false;
		}
	}
}

void deleteNotPoss(int predict, int strike, int ball) {
	string predict_str = to_string(predict);
	for (set<int>::iterator it = possibles.begin(); it != possibles.end(); ) {
		string it_str = to_string(*it);
		int S = 0, B = 0;
		
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (predict_str[i] == it_str[j]) {
					if (i == j) S++;
					else B++;
				}
			}
		}

		if (strike != S || ball != B) {
			set<int>::iterator temp = it;
			temp++;
			possibles.erase(*it);
			it = temp;
		}
		else
			it++;
	}
}


int main() {
	int answer = 0, n;
	vector<bool> visited(10, false);
	makePossible("", 0, visited);

	cin >> n;

	for (int i = 0; i < n; i++) {
		int predict, strike, ball;
		cin >> predict >> strike >> ball;

		deleteNotPoss(predict, strike, ball);

	}

	answer = possibles.size();
	printf("%d\n", answer);
	return 0;
}

 

 

 

'PS > 백준 문제풀이' 카테고리의 다른 글

[백준 2075] N번째 큰 수  (0) 2019.08.29
[백준 1715] 카드 정렬하기  (0) 2019.08.29
[백준 1620] 나는야 포켓몬 마스터 이다솜  (0) 2019.08.21
[백준 1269] 대칭 차집합  (0) 2019.08.21
[백준 1068] 트리  (0) 2019.08.17