study
비밀 코드 해독[프로그래머스]
Date: 2026-06-01 04:59
Update: 2026-06-01 08:15


비밀 코드 해독[프로그래머스]

접근법:

  1. 조건에 따라 n 이하의 숫자로 순열을 만든다
    1. 백트래킹을 사용하여, 모든숫자에 대한 순열을 만든다.
  2. 글자수와 암호가 같아지면 시도했던 숫자와 암호가 얼마나 맞는지 확인한다.
  3. 모든 경우가 일치한다면 후보를 증가시킨다.
#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;
}