https://programmers.co.kr/learn/courses/30/lessons/42841
#include <string>
#include <vector>
using namespace std;
int const MAX = 3;
vector<vector<int>> testcase;
int cnt;
/*
주어진 테스트 케이스를 다 만족하는지 검사하기
각 테스트 숫자를 정답숫자와 비교하여 n스트라이크 m볼이 나왔다면,
역으로 정답숫자도 각 테스트 숫자와 비교하면 n스트라이크 m볼이 나올 것.
*/
bool possible(int num)
{
for (int i = 0; i < testcase.size(); i++)
{
if (num == testcase[i][0])
{
return false;
}
int strike = 0;
int ball = 0;
string str_num = to_string(num);
string str_test = to_string(testcase[i][0]);
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (str_num[i] == str_test[j])
{
if (i == j)
{
strike++;
}
else
{
ball++;
}
}
}
}
if (strike != testcase[i][1] || ball != testcase[i][2])
{
return false;
}
}
return true;
}
void perm(int output, bool visited[], int depth, int r)
{
// depth가 3에 도달하면 만들어진 숫자 검사
if (depth == r)
{
if (possible(output))
{
cnt++;
}
return;
}
// 1~9까지의 서로 다른 수로 3자리수 만들기
for (int i = 1; i <= 9; ++i)
{
if (!visited[i])
{
visited[i] = true;
output = output * 10 + i;
perm(output, visited, depth + 1, r);
output /= 10;
visited[i] = false;
}
}
}
int solution(vector<vector<int>> baseball) {
// 전역vector와 포인터 교환
testcase.swap(baseball);
bool visited[10] = { 0, };
// 3자리의 숫자를 조합한 후, 주어진 조건 충족여부를 검사하기
perm(0, visited, 0, 3);
return cnt;
}
예전에 java로 푼적이 있던 문제다.
그런데 지금 보니 코드가...ㅋㅋㅋㅋㅋㅋ
너무 심각하게 현란하여, 그냥 새 글을 팠다.
과거 글은 발전의 기록으로 두려고 한다.
이번 코드는 깔끔하다
조합 -> 검사 -> 카운팅!
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스]탐욕법(Greedy) : 조이스틱 (level 2) (c++) (0) | 2020.05.07 |
---|---|
[프로그래머스]탐욕법(Greedy) : 큰 수 만들기 (level 2)(c++) (0) | 2020.05.06 |
[프로그래머스]정렬 : H-Index (level 2) (c++) (0) | 2020.05.03 |
[프로그래머스]연습문제 : N개의 최소공배수 (level 2) (c++) (0) | 2020.05.01 |
[프로그래머스]완전탐색 : 소수 찾기 (level 2)(c++) (2) | 2020.04.30 |
댓글