[문제]
숫자 야구 게임이란 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의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
입출력 예
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] | 2 |
[풀이]
1. 프로그래머스의 좋은 점은 완탐문제가 다양하다는 점인 것 같다. (최소/ 최대값을 위한 완탐이 아닌 정말 완탐을 위한 완탐)
2. 이 문제가 정말 약간 노가다..? cpu 괴롭히기? 같은 문제였다.
실행시간.. 물론 최적화 잘하시는 고수분들은 다를 수도 있지만.
3.
- 3자리 숫자이면서
- 0이 포함되지 않고
- 숫자가 중복되지 않는 수
최소 : 123 / 최대 : 987 이라는 제한 선을 두고 시작했다.
4. 그리고 숫자 비교는 string으로 만들어서 비교했다. int로 비교하면 mod연산과 10으로 나누고 하는 과정이 귀찮았다.
5. 일단 i(123~987)을 가장 바깥쪽으로 돌면서 각 baseball에서 정해진 규칙에 맞는지 확인한다.
-자리와 숫자가 같으면 strike++
-숫자만 같으면 ball++
=> 해당 규칙 그러니까 baseball[i][0] ~ [2] 를 돌았을 때 주어진 규칙과 부합하지 않으면 그냥 i (기준 숫자) 는 우리가 원하는 숫자가 아니므로 다음 i를 비교한다.
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
45
46
|
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> baseball) {
int answer = 0;
// 가장 작은 숫자 : 123 / 가장 큰 숫자 : 987 까지 비교하면서 스트라이크 볼이 맞는 수를 찾아간다.
//수 비교는 string으로 바꿔서 해도 될듯 (안 그러면 10 나누고 mod 연산 해야하니까 )
for (int i = 123; i <= 987; i++){
string tmp = to_string(i);
bool flag = true;
if (tmp[0] == tmp[1] || tmp[1] == tmp[2] || tmp[0] == tmp[2]) continue;// 숫자 중복 비허용
if (tmp[0] == '0' || tmp[1] == '0' || tmp[2] == '0') continue; //숫자 0 비허용
for (int j = 0; j < baseball.size(); j++) {
int strike = 0, ball = 0;
for (int a = 0; a < 3; a++) {
for (int b = 0; b < 3; b++) {
string num = to_string(baseball[j][0]); //매번 새로 가져옴
if (a == b && tmp[a] == num[b] ){
//스트라잌
strike++;
continue;
}
else if (tmp[a] == num[b]) {
ball++;
continue;
}
}
}//for a
//한 숫자를 다 살펴봄
if (strike != baseball[j][1] || ball != baseball[j][2]) {
//i는 알맞은 숫자가 아님
flag = false;
break;
}
}//for j(baseball)
if (flag) answer++;
}
return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'Programmers > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 입국심사 (0) | 2019.08.20 |
---|---|
[프로그래머스] 가장 큰 수 (0) | 2019.08.20 |
[프로그래머스] 단어변환 (0) | 2019.08.20 |
[프로그래머스] 예산 (0) | 2019.08.19 |
[프로그래머스] 섬 연결하기 (0) | 2019.08.17 |