• Home
  • About
    • 끄적끄적 photo

      끄적끄적

      하루하루 성장하기

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[프로그래머스] 숫자 야구

17 Oct 2018

Reading time ~5 minutes

문제

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

  • 숫자는 맞지만, 위치가 틀렸을 때는 볼
  • 숫자와 위치가 모두 맞을 때는 스트라이크
  • 숫자와 위치가 모두 틀렸을 때는 아웃

예를 들어, 아래의 경우가 있으면

A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.


제한사항

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.


입출력 예

baseball return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2


풀이

먼저 solution()에서는 1~9까지의 숫자들을 각 한 번씩만 사용해서 만들 수 있는 모든 세 자리 수 조합으로 answer를 초기화한다.
그런 다음 입력 받은 세자리 수, 스트라이크, 볼을 가지고 baseballGame 함수를 호출한다.

baseballGame()에서는 answer에 들어있는 각각의 숫자들이 인자로 받은 숫자와 같은 strike, ball 수를 가지는지 isCandidate()를 통해 확인한다.
만약 같은 조합을 가져서 정답 후보가 된다면 candidate에 추가 후 마지막에 answer를 candidate으로 바꾼다.
이런 방식으로 answer 벡터 안의 정답 후보 숫자들을 점점 줄여가고, 마지막에 그 수를 return한다.

isCandidate()에서는 인자로 받은 두 숫자의 각 자리 숫자들을 비교해서 strike, ball이 입력 받은 조합과 같은지를 boolean으로 return한다.


#include <vector>
using namespace std;

bool isCandidate(int candidate, int number, int strike, int ball) {
    int strikeCount = 0;
    int ballCount = 0;
    int a1 = candidate / 100;
    int a2 = (candidate % 100) / 10;
    int a3 = candidate % 10;
    int b1 = number / 100;
    int b2 = (number % 100) / 10;
    int b3 = number % 10;
    
    if (a1 == b1) strikeCount++;
    if (a2 == b2) strikeCount++;
    if (a3 == b3) strikeCount++;
    
    if (a1 == b2 || a1 == b3) ballCount++;
    if (a2 == b1 || a2 == b3) ballCount++;
    if (a3 == b1 || a3 == b2) ballCount++;
    
    return strikeCount == strike && ballCount == ball;
}

void baseballGame(vector<int> &answer, int number, int strike, int ball) {
    vector<int> candidates;
    for (int i = 0; i < answer.size(); i++) {
        if (isCandidate(answer[i], number, strike, ball))
            candidates.push_back(answer[i]);
    }
    answer = candidates;
}

int solution(vector<vector<int>> baseball) {
    vector<int> answer;
    int digit[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            for (int k = 0; k < 9; k++) {
                if(i != j && j != k && k != i)
                    answer.push_back(digit[i] * 100 + digit[j] * 10 + digit[k]);
            }
        }
    }
    
    for (int i = 0; i < baseball.size(); i++)
        baseballGame(answer, baseball[i][0], baseball[i][1], baseball[i][2]);
    
    return answer.size();
}



출처: https://programmers.co.kr



알고리즘algorithm프로그래머스완전탐색 Share Tweet +1