문제풀이(Problem Solving)

백준, BOJ, 2503번, 숫자야구 : C++ [CPP]

게임이 더 좋아 2021. 12. 5. 18:10
반응형
728x170

이것도 어렵다.

사실 BruteForce문제는 어렵다.

우리 머리 속에서 생략한 계산을 표현할 줄 알아야 하기 때문이다.

우리는 왜 숫자야구를 할 수 있을까?

왜 이것은 후보가 아닐까를..? 표현할 수 있어야 한다.

알아보자

 

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

 


 

#맞는 풀이

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;


int N; // 주어진 힌트 수

bool num[1001];



int main(){
    cin >> N;
    
    fill(num, num+1001, true); // 처음엔 숫자모르니까 다 정답의 후보
    
    //하지만 같은 숫자가 있으면 후보가 될 수 없음.
    for (int i = 100; i <= 999; i++)
	{
		string temp = to_string(i);
        //중복되는 숫자가 있으면
		if (temp[0] == temp[1] || temp[0] == temp[2] || temp[1] == temp[2]){
            num[i] = false;
            continue;
        }
        //0은 있으면 안됨
		if (temp[0] - '0' == 0 || temp[1] - '0' == 0 || temp[2] - '0' == 0){
            num[i] = false;
            continue;
        }
	}
    
    for(int i = 0; i<N; i++){
        int n;
        int st,b;
        cin >> n >> st >> b;
        string s = to_string(n); // 정답을 가리는 기준

        
        //서로 다른 숫자인 세자리 숫자.(숫자가 중복되는 후보는 위에서 걸러짐)
        for(int i = 100; i<=999; i++){
            //만약 후보 중에서 비교해봄
            if(num[i]){
				string compare = to_string(i); //비교대상(세자리 숫자)
                int compSt = 0;
                int compB = 0;

				for (int x = 0; x < 3; x++) {
					for (int y = 0; y < 3; y++) {
                        
                        //1. 자리도 같고 숫자도 같은지
						if (x == y && s[x]==compare[y]){
                            compSt ++;
                            continue;
                        }
                        //2. 자리는 다른데 숫자는 같은지.
						if (x != y && s[x] == compare[y]){
							compB++;
                            continue;
                        }
					}
				}
                
                //해당 후보가 후보인지 체크 -> 스트라이크나 볼이 다르면 후보가 아님
				if (st != compSt || b != compB){
                    num[i] = false; //후보 탈락 
                    continue; // 다음 숫자
                }
            }
        }
    }
    
    int ans = 0;
    
    for(int i = 100; i<=999; i++){
        if(num[i])ans++;
    }
    
    cout << ans;
    return 0;
}

 

 

전수조사는 생략된 우리 머릿속의 생각까지

쓸 수 있어야 하기 때문에 정말 어렵다.

쉬우면서도 어렵다.

 

728x90
반응형
그리드형