문제

구름이는 기존의 숫자 야구 게임보다 더 복잡한 자리 규칙 숫자 야구 게임을 하려고 한다. 규칙은 다음과 같다.

보통의 숫자 야구 게임은 매번 입력을 받지만, 규칙 숫자 야구는 처음 입력을 기반으로 정답을 찾아간다. 아래의 방법 순서대로 다음 번 입력을 생성한다.

  1. 현재 입력의 i번째 값이 Strike라면, 값을 움직이지도 바꾸지도 않는다.
  2. 현재 입력의 i번째 값이 Fail 이라면, 현재 입력 값에 1을 더한다. 만약에 더한 값이 현재 입력에 존재한다면, 더한 값이 존재 하지 않을 때 까지 1을 입력한다.
  3. Fail에 대한 더하기 연산은 항상 첫 번째 값부터 처리하며, 더한 값이 10이 되면 0으로 돌아간다.
  4. 판단 결과 중에서 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);
}