알고리즘/Programmers

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

스푼앤포크 2019. 10. 8. 15:51

숫자 야구

숫자 야구 게임이란 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의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

입출력 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <string>
#include <vector>
 
using namespace std;
 
int solution(vector<vector<int>> baseball) {
    int answer = 0;
    int strike = 0;
    int ball = 0;
    string num1, num2;
    //서로 다른 숫자 최소 123 - 최대 987까지 baseball안에 있는 num과 비교해주기
    for(int i=123;i<=987;i++){
        num1 = to_string(i);
        if(num1[0]==num1[1|| num1[1== num1[2|| num1[0]==num1[2]) continue;
        else if(num1[0]=='0' || num1[1]=='0' || num1[2]=='0')continue;
        //1부터 9까지이므로 0도 빼줌
        bool flag = true;
        for(int j=0; j<baseball.size();j++){
            num2 = to_string(baseball[j][0]);
            strike = 0;
            ball = 0;
            for(int a = 0; a<3; a++){
                for(int b=0; b<3; b++){
                    //스트라이크의 경우 (숫자, 위치 모두 일치)
                    if(a==&& num1[a] == num2[b]){
                        strike++;
                        continue;
                    }
                    //볼의 경우 (숫자일치,위치 불일치)
                    if(a!=&& num1[a] == num2[b]){
                        ball++;
                        continue;
                    }
                }
            }
            //현재 숫자가 맞는지 확인
            if(baseball[j][1]!=strike || baseball[j][2]!=ball){
                flag = false;
                break;
            }
        }
        if(flag)answer++;
    }
    return answer;
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

*다른 사람 풀이 참고

아래코드는 1의자리, 10의자리, 100의 자리 구하는 것 이용해서 문제풀이

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <string>
#include <vector>
 
using namespace std;
int que[3];
int ans[3];
int solution(vector<vector<int>> baseball) {
    int answer = 0;
    for(int i=123;i<=987;i++)
    {
        int count = 0;
        que[0]=i/100;
        que[1]=i/10%10;
        que[2]=i%10;
        if(!que[1|| !que[2|| que[0==que[1|| que[1==que[2|| que[2== que[0]) continue;
        for(int j=0;j<baseball.size();j++)
        {
            int strike = 0;
            int ball = 0;
            int num = baseball[j][0];
            ans[0]=num/100;
            ans[1]=num/10%10;
            ans[2]=num%10;
            for(int k=0;k<3;k++)
            {
                if(que[k]==ans[k]) strike++;
                if(que[k]==ans[(k+1)%3|| que[k] == ans[(k+2)%3]) ball++;
            }
            if(strike == baseball[j][1&& ball == baseball[j][2]) count++;
        }
        if(count==baseball.size())
            answer++;
    }
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter





|본 포스팅은 쿠팡 파트너스의 일환으로 소정의 수수료를 제공받을 수 있음을 알립니다 |