본문 바로가기
Algorithm/프로그래머스

[프로그래머스]완전탐색 : 숫자 야구 (level 2)(c++)

by HBGB 2020. 5. 4.

https://programmers.co.kr/learn/courses/30/lessons/42841

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

#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로 푼적이 있던 문제다.

 

그런데 지금 보니 코드가...ㅋㅋㅋㅋㅋㅋ 

너무 심각하게 현란하여, 그냥 새 글을 팠다. 

과거 글은 발전의 기록으로 두려고 한다.

 

이번 코드는 깔끔하다

조합 -> 검사 -> 카운팅!

 

댓글