[백준 / C++] 2503번 숫자 야구

akim·2023년 1월 31일
0

Algorithm 

목록 보기
4/14

문제 재정의 및 추상화

결론: 0과 중복 수를 허용하지 않는 숫자 게임에서 가능성 있는 답의 개수를 구하라.


문제 접근 방식

  • 숫자만 같은 게 아니라 그 숫자의 자리도 중요하다
    -> 인덱스 접근을 유용하게 하기 위해 문자열로 다뤄보자!

해법을 찾는데 결정적이었던 깨달음

📌 123~987 사이의 숫자를 담은 배열에 0과 중복을 제외하도록 답안지를 미리 만들어 둔다.

문제 풀이 로직

  1. 질문의 횟수 n을 입력받는다.
  2. 답안지 배열을 일단은 모두 true로 세팅한다.
  3. 123부터 987까지 돌며 0을 포함하거나 중복 수가 있는 경우 답안지 배열의 해당 인덱스를 false로 세팅한다.
  4. n번 반복하며 아래를 실행한다.
    4-1. 세자리 숫자, 스트라이크 개수, 볼 개수를 입력받는다.
    4-2. 123부터 987까지 돌며 true인 인덱스에 한해 스트라이크와 볼 개수를 검사한다.
    4-3. 만약 스트라이크와 볼 개수가 입력받았던 숫자와 하나라도 다른 인덱스를 발견하면 해당 인덱스의 답안지 배열을 false로 바꾼다.
  5. 123부터 987까지 돌며 답안지 배열에서 true가 나온 횟수를 세 출력한다.

문제 풀이

#include <bits/stdc++.h>
using namespace std;

int n, num, str, ball;
bool ans[1001];
string temp, compare1, compare2;
int s_cnt, b_cnt, cnt = 0;
    
int main(){
    cin >> n;
    
    memset(ans, true, sizeof(ans));

    for(int i = 123; i <= 987; i++){
        temp = to_string(i);
            
        if(temp[0] == temp[1] || temp[1] == temp[2] || temp[0] == temp[2]) ans[i] = false;
        if(temp[0] - '0'  == 0 || temp[1] - '0'  == 0 || temp[2] - '0' == 0) ans[i] = false;
    }
    
    for(int i = 1; i <= n; i++){
        cin >> num >> str >> ball;

        for(int i = 123; i <= 987; i++){
            s_cnt = 0;
            b_cnt = 0;
            
            if(ans[i]){
                compare1 = to_string(num);
                compare2 = to_string(i);
    
                for(int a = 0; a < 3; a++){
                    for(int b = 0; b < 3; b++){
                        if(a == b && compare1[a] == compare2[b]) s_cnt++;
                        if(a != b && compare1[a] == compare2[b]) b_cnt++;
                    }
                }
                
                if(s_cnt != str || b_cnt != ball) ans[i] = false;
            }
        }
    }
    
    for(int i = 123; i <= 987; i++) {
        if(ans[i]) cnt++;
    }
    
    cout << cnt;
    
    return 0;
}

(사담)

브루트포스에 유독 약한 것 같다.

그냥 인간의 머리로는 당연히 이렇게 하면 답인데? 싶은 것들을 코드로 하나하나 구현하자니 빼먹는 경우의 수도 너무 많고... 😇

꽥.

profile
학교 다니는 개발자

0개의 댓글