구름이는 기존의 숫자 야구 게임보다 더 복잡한 자리 규칙 숫자 야구 게임을 하려고 한다. 규칙은 다음과 같다.
Strike, Ball, Fail을 판단한다Strike는 입력의 i번째 값이 정답에 포함되고, 위치도 같은 경우이다.Ball은 입력의 i번째 값이 정답에 포함만 되는 경우이다.Fail은 입력의 i번째 값이 정답에 포함되어 있지 않는 경우이다.Strike가 4개가 되면, 게임에서 승리한다.보통의 숫자 야구 게임은 매번 입력을 받지만, 규칙 숫자 야구는 처음 입력을 기반으로 정답을 찾아간다. 아래의 방법 순서대로 다음 번 입력을 생성한다.
Strike라면, 값을 움직이지도 바꾸지도 않는다.Fail 이라면, 현재 입력 값에 1을 더한다. 만약에 더한 값이 현재 입력에 존재한다면, 더한 값이 존재 하지 않을 때 까지 1을 입력한다.Fail에 대한 더하기 연산은 항상 첫 번째 값부터 처리하며, 더한 값이 10이 되면 0으로 돌아간다.Ball가 있다면, Strike결과를 제외하고 오른쪽으로 한 칸 회전한다. 마지막 숫자라면, 맨 처음 칸으로 돌아간다. 판단 결과에 Ball이 없다면, 4번 과정은 진행하지 않는다.규칙 숫자 야구 게임의 규칙을 확인하고, 구름이가 정답을 맞추기 위해서 새로운 입력을 몇 번 생성해야 하는지 출력하시오.
#include <iostream>
#include <string>
#include <vector>
enum BALL_STATUS {
FAIL,
STRIKE,
BALL
};
enum GAME_STATUS {
ALLSTRIKE,
BALLEXIST,
STRIKEORFAIL,
};
using namespace std;
int checkGameStatus(string& answer, string& input, vector<int>& ballStatus) {
int gameStatus;
gameStatus = ALLSTRIKE;
for (int i = 0; i < 4; i++) {
if (answer[i] == input[i])
ballStatus[i] = STRIKE;
else if (answer.find(input[i]) != string::npos) {
ballStatus[i] = BALL;
gameStatus = BALLEXIST;
}
else
{
ballStatus[i] = FAIL;
if (gameStatus != BALLEXIST)
gameStatus = STRIKEORFAIL;
}
}
return (gameStatus);
}
void addFail(string& answer, string& input, vector<int>& ballStatus) {
char num;
for (int i = 0; i < 4; i++) {
if (ballStatus[i] == FAIL) {
num = input[i] + 1;
if (num == '9' + 1)
num -= 10;
while ((input.find(num) != string::npos)) {
num++;
if (num == '9' + 1)
num -= 10;
}
input[i] = num;
}
}
}
void rotate(string& input, vector<int>& ballStatus) {
char tmp;
char rotateNum;
int startIdx;
startIdx = 0;
rotateNum = '0';
while (startIdx < 4)
{
if (ballStatus[startIdx] != STRIKE)
break ;
startIdx++;
}
for (int i = startIdx; i < 4; i++) {
if (ballStatus[i] == STRIKE)
continue ;
tmp = input[i];
input[i] = rotateNum;
rotateNum = tmp;
}
input[startIdx] = rotateNum;
}
int main() {
int generateCount = 1;
int gameStatus = 0;
vector<int> ballStatus(4);
string answer;
string input;
cin >> answer;
cin >> input;
while (true) {
gameStatus = checkGameStatus(answer, input, ballStatus);
if (gameStatus == ALLSTRIKE)
break ;
addFail(answer, input, ballStatus);
if (gameStatus == BALLEXIST)
rotate(input, ballStatus);
generateCount++;
}
cout << generateCount << endl;
return (0);
}