알고리즘/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==b && num1[a] == num2[b]){
strike++;
continue;
}
//볼의 경우 (숫자일치,위치 불일치)
if(a!=b && 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
|
|본 포스팅은 쿠팡 파트너스의 일환으로 소정의 수수료를 제공받을 수 있음을 알립니다 |