study
비밀 코드 해독[프로그래머스]
Date: 2026-06-01 04:59
Update: 2026-06-01 08:15
비밀 코드 해독[프로그래머스]
접근법:
- 조건에 따라 n 이하의 숫자로 순열을 만든다
- 백트래킹을 사용하여, 모든숫자에 대한 순열을 만든다.
- 글자수와 암호가 같아지면 시도했던 숫자와 암호가 얼마나 맞는지 확인한다.
- 모든 경우가 일치한다면 후보를 증가시킨다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int answer = 0;
void dfs(int start, vector<int>& comb, int n, const vector<vector<int>>& q, const vector<int>& ans)
{
if(comb.size() == 5)
{
bool is_valid = true;
for(int i = 0; i < q.size(); ++i)
{
int match_count = 0;
if(find(comb.begin(), comb.end(), q[i][0]) != comb.end()) match_count++;
if(find(comb.begin(), comb.end(), q[i][1]) != comb.end()) match_count++;
if(find(comb.begin(), comb.end(), q[i][2]) != comb.end()) match_count++;
if(find(comb.begin(), comb.end(), q[i][3]) != comb.end()) match_count++;
if(find(comb.begin(), comb.end(), q[i][4]) != comb.end()) match_count++;
if(match_count != ans[i])
{
is_valid = false;
break;
}
}
if(is_valid)
answer++;
return;
}
for(int i = start; i <= n; ++i)
{
comb.push_back(i);
dfs(i + 1, comb, n, q, ans);
comb.pop_back();
}
}
int solution(int n, vector<vector<int>> q, vector<int> ans) {
answer = 0;
vector<int> comb;
dfs(1, comb, n, q, ans);
return answer;
}
.gif)