문제 설명
숫자 야구 게임이란 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의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
입출력 예
baseball | return |
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] | 2 |
입출력 예 설명
문제에 나온 예와 같습니다.
문제 풀이
문제 자체는 어렵지 않았는데 조건을 놓쳐서 헤맸다.
1. 일단, Ball인지 검사할 떄 Strike인 경우를 제외할 것
2. 숫자 0은 제외한 1~9까지의 숫자 중 각 한번씩만 사용할 것
3. char을 string으로 바꿀 때 to_string()을 사용하지 말것. 대신, string str(1, ch)와 같은 방법을 사용할 것
Solution.cpp
#include <string>
#include <vector>
using namespace std;
// 0이 포함되어있거나 중복된 숫자 사용시 true 반환
bool isZeroOver(string str)
{
bool check[10] = {false,}; // 모두 false로 초기화
for(int i=0; i<str.size(); i++) {
if(str.at(i) == '0') // 0이 포함되어있으면 안됨
return true;
string s(1, str.at(i)); // char to string
int index = stoi(s); // string to integer
if(check[index]) // 중복된 숫자 체크
return true;
check[index] = true;
}
return false;
}
// 스트라이크 검사: 위치, 숫자 일치
int isStrike(string str1, string str2)
{
int cnt = 0;
for(int i=0; i<str1.size(); i++) {
if(str1.at(i)==str2.at(i))
cnt++;
}
return cnt;
}
// 볼 검사: 숫자'만' 일치
int isBall(string str1, string str2)
{
int cnt = 0;
for(int i=0; i<str1.size(); i++) {
for(int j=0; j<str2.size(); j++) {
if(i==j) // 스트라이크인 경우 제외
continue;
if(str1.at(i)==str2.at(j))
cnt++;
}
}
return cnt;
}
int solution(vector<vector<int>> baseball) {
int answer = 0;
for(int num=100; num<1000; num++) {
string numStr = to_string(num);
if(isZeroOver(numStr))
continue;
bool flag = true;
for(int i=0; i<baseball.size(); i++) {
string baseballStr = to_string(baseball.at(i).at(0));
if((isStrike(numStr, baseballStr) != baseball.at(i).at(1))
|| (isBall(numStr, baseballStr) != baseball.at(i).at(2))) {
flag = false;
break;
}
}
if(flag)
answer++;
}
return answer;
}
문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42841
'알고리즘 문제풀이 > 문제풀이' 카테고리의 다른 글
[c++] 백준: 재귀 / 팩토리얼 (0) | 2020.04.01 |
---|---|
[c++] 프로그래머스: 완전탐색 / 카펫 (0) | 2020.03.31 |
[c++] 프로그래머스: 완전탐색 / 소수 찾기 (0) | 2020.03.27 |
[c++] 프로그래머스: 깊이 우선 탐색(DFS) / 단어 변환 (0) | 2020.03.21 |
[c++] 프로그래머스: 깊이 우선 탐색(DFS) / 네트워크 (0) | 2020.03.13 |