https://programmers.co.kr
문제:
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 게임해보기
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
1
2
3
|
* 숫자는 맞지만, 위치가 틀렸을 때는 볼
* 숫자와 위치가 모두 맞을 때는 스트라이크
* 숫자와 위치가 모두 틀렸을 때는 아웃
|
예를 들어, 아래의 경우가 있으면
1
2
3
4
5
6
7
8
|
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 함수를 작성해주세요.
풀이:
123 부터 987 까지 모든 경우의 수를 완전 탐색한다.
이 때, 숫자에 0이 들어가거나 222처럼 중복되는 단어가 들어가면 안되므로 제외시켜준다.
현재 숫자와 주어진 숫자들을 3자리 모두 비교하여 숫자와 위치가 모두 같다면 스트라이크를 1 더하고, 숫자가 같으나 위치가 다르다면 볼을 1 더해준다.
만약, 스트라이크와 볼이 주어진 숫자와 같다면 true를 배정한다.
현재 숫자와 주어진 숫자들을 모두 비교했을 때, true값이 있다면 가능한 숫자이므로, answer값을 1 올려준다.
코드:
사용언어 : c++
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
|
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> baseball) {
int answer = 0;
for (int i = 123;i <= 987;i++) {
string a = to_string(i);
bool c = true;
if (a[0] == a[1] || a[0] == a[2] || a[1] == a[2] || a[0] == '0' || a[1] == '0' || a[2] == '0')
continue;
for (int t = 0;t < baseball.size();t++) {
string b = to_string(baseball[t][0]);
int strike = 0;
int ball = 0;
for (int y = 0; y < 3; y++) {
for (int u = 0;u < 3;u++) {
if (a[y] == b[u]) {
if (y == u)
strike++;
else
ball++;
}
}
}
if (strike != baseball[t][1] || ball != baseball[t][2]) {
c = false;
break;
}
}
if (c)
answer++;
}
return answer;
}
|