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(0, 1))); numlist.push_back(stoi(strtmp.substr(1, 1))); numlist.push_back(stoi(strtmp.substr(2, 1))); v.push_back(numlist); numlist.clear(); } btk(0, clue); return ans; } | cs |
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스: 네트워크 (C++) (0) | 2019.09.28 |
---|---|
프로그래머스: 카펫 (C++) (0) | 2019.09.28 |
프로그래머스: 소수찾기 (C++) (0) | 2019.09.27 |
프로그래머스: 타겟 넘버 (C++) (0) | 2019.09.20 |
프로그래머스: 문자열 내 p와 y의 개수 (C++) (0) | 2019.09.20 |