※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소입니다.
https://programmers.co.kr/learn/courses/30/lessons/42841
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
3.1 주석 없는 코드
3.2 주석 있는 코드
3.3 테스트 코드
4. 결과
1. 문제 설명
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다. |
* 숫자는 맞지만, 위치가 틀렸을 때는 볼 * 숫자와 위치가 모두 맞을 때는 스트라이크 * 숫자와 위치가 모두 틀렸을 때는 아웃 |
문제!!
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요. |
제한사항
|
예시
baseball | return |
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] | 2 |
A : 123 B : 1스트라이크 1볼. A : 356 B : 1스트라이크 0볼. A : 327 B : 2스트라이크 0볼. A : 489 B : 0스트라이크 1볼. 이때 가능한 답은 324와 328 두 가지입니다. |
2. 문제풀이
문제부터가 완전탐색이기때문에 모든 경우의 수를 가지고 문제를 풀기로 했습니다. 처음에 가능한 모든 경우의 수를 만듭니다. 1~9사의 숫자가 각각1개씩이므로 0이 들어간경우와 숫자가 겹치는 경우는 경우의 수에서 제거했습니다.
질문이 들어오면 이제 경우의 수와 비교합니다. 비교해서 스트라이크혹은 볼의 수가 맞지않는다면 경우의 수에서 제거를 합니다.
모든질문을 다확인한 후에 남은 경우의 숫자만큼 반환을 하면 끝입니다. |
3. 소스코드
3.1 주석없는 코드
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
|
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(vector<vector<int>> baseball) {
vector<string> a;
for (int i = 123; i <= 987; i++) {
string temp{ to_string(i) };
if (temp[0] == temp[1] || temp[1] == temp[2] || temp[2] == temp[0] ||
temp[0] == '0' || temp[1] == '0' || temp[2] == '0')
continue;
a.push_back(temp);
}
for (auto b : baseball) {
string temp = to_string(b[0]);
for (int i = a.size() - 1; i >= 0; i--) {
int strike = 0, ball = 0;
for (int j = 0; j < 3; j++) {
if (temp[j] == a[i][j]) strike++;
if (temp[j] == a[i][(j + 1) % 3] || temp[j] == a[i][(j + 2) % 3])
ball++;
}
if (strike != b[1] || ball != b[2]) a.erase(a.begin() + i);
}
}
return a.size();
}
|
3.2 주석있는 코드
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 <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(vector<vector<int>> baseball) {
vector<string> a;
//할수 있는 경우의 수 추가
for (int i = 123; i <= 987; i++) {
string temp{ to_string(i) };
if (temp[0] == temp[1] || temp[1] == temp[2] || temp[2] == temp[0] ||
temp[0] == '0' || temp[1] == '0' || temp[2] == '0')
continue;
a.push_back(temp);
}
//경우의 수 확인하기
for (auto b : baseball) {
string temp = to_string(b[0]);
for (int i = a.size() - 1; i >= 0; i--) {
int strike = 0, ball = 0;
for (int j = 0; j < 3; j++) {
//스트라이크 수 체크
if (temp[j] == a[i][j]) strike++;
//볼 수 체크
if (temp[j] == a[i][(j + 1) % 3] || temp[j] == a[i][(j + 2) % 3])
ball++;
}
//스트라이크나 볼의 수가 맞지않는다면 경우의 수에서 제거
if (strike != b[1] || ball != b[2]) a.erase(a.begin() + i);
}
}
//남은 경우의 수 반환
return a.size();
}
|
3.3 테스트 코드 추가
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
47
|
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(vector<vector<int>> baseball) {
vector<string> a;
//할수 있는 경우의 수 추가
for (int i = 123; i <= 987; i++) {
string temp{ to_string(i) };
if (temp[0] == temp[1] || temp[1] == temp[2] || temp[2] == temp[0] ||
temp[0] == '0' || temp[1] == '0' || temp[2] == '0')
continue;
a.push_back(temp);
}
//경우의 수 확인하기
for (auto b : baseball) {
string temp = to_string(b[0]);
for (int i = a.size() - 1; i >= 0; i--) {
int strike = 0, ball = 0;
for (int j = 0; j < 3; j++) {
//스트라이크 수 체크
if (temp[j] == a[i][j]) strike++;
//볼 수 체크
if (temp[j] == a[i][(j + 1) % 3] || temp[j] == a[i][(j + 2) % 3])
ball++;
}
//스트라이크나 볼의 수가 맞지않는다면 경우의 수에서 제거
if (strike != b[1] || ball != b[2]) a.erase(a.begin() + i);
}
}
//남은 경우의 수 반환
return a.size();
}
void print(vector<vector<int>> baseball, int answer) {
int t = solution(baseball);
if (t == answer) cout << "정답" << endl;
else cout << "실패" << endl;
}
int main() {
print({ 123, 1, 1 }, { 356, 1, 0 }, { 327, 2, 0 }, { 489, 0, 1 }, 2);
return 0;
}
|
4. 결과
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
괄호 변환 C++(카카오 2020)[프로그래머스] (0) | 2019.12.05 |
---|---|
체육복 C++(그리디,탐욕법)[프로그래머스] (1) | 2019.12.03 |
소수찾기 C++(완전탐색)[프로그래머스] (5) | 2019.12.01 |
실패율 C++,Python(카카오 블라인드 2019)[프로그래머스] (0) | 2019.11.30 |
짝지어 제거하기 C++(팁스다운2017)[프로그래머스] (1) | 2019.11.29 |
댓글