https://www.welcomekakao.com/learn/courses/30/lessons/42841


0이 아닌 숫자를 중복하지 않고 사용해서 세자리 수를 만든다.


세자리 숫자를 만들떄마다, 입력으로 들어오는 스트라이크와 볼 정보를 비교해서 만족하는 수일 경우에만 정답의 수를 증가시켜준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <string>
#include <vector>
#include<iostream>
#include<set>
using namespace std;
 
bool used[10];
int arr[3];
vector<vector<int> > v; 
int ans = 0;
 
void btk(int k, vector<vector<int> > &clue) {
    if (k == 3) {
        // 후보로 만들어낸 수
        int candi = arr[0* 100 + arr[1* 10 + arr[2];
 
        string candiStr = to_string(candi);
        for (int i = 0; i < clue.size(); i++) {
            int stkCnt = 0, ballCnt = 0;
 
            for (int j = 0; j < candiStr.length(); j++) {
                //char를 int로 바꿔서 비교
                if (candiStr[j] - '0' == v[i][j]) //스트라이크 조건
                    stkCnt++;
                else {
                    for (int m = 0; m < 3; m++) { //볼 조건
                        if (candiStr[j] - '0' == v[i][m])
                            ballCnt++;
                    }
                }
            }
 
            if (stkCnt != clue[i][1|| ballCnt != clue[i][2]) return;
        }
        ans++;
        return;
    }
 
    for (int i = 1; i <= 9; i++) {
        if (!used[i]) {
            arr[k] = i;
            used[i] = true;
            btk(k + 1, clue);
            used[i] = false;
        }
    }
}
 
int solution(vector<vector<int>> clue) {
    vector<int> numlist;
    for (int i = 0; i < clue.size(); i++) {
        int tmp = clue[i][0];
        string strtmp = to_string(tmp);
        //힌트로 들어오는 숫자를 자릿수별로 끊어서 벡터에 저장
        numlist.push_back(stoi(strtmp.substr(01)));
        numlist.push_back(stoi(strtmp.substr(11)));
        numlist.push_back(stoi(strtmp.substr(21)));
        v.push_back(numlist);
        numlist.clear();
    }
 
    btk(0, clue);
    return ans;
}
 
cs


+ Recent posts