알고리즘/BOJ
백준 2503번: 숫자 야구 (c++)
대 혁
2020. 4. 23. 21:31
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.
www.acmicpc.net
솔루션만 생각해낸다면 어렵지 않게 구현할 수 있다.
필자는 민혁이가 질문한 숫자와 그 숫자에 대한 스트라이크, 볼 갯수를 vector배열에 저장한 다음 1~9까지 숫자로 세 자리 숫자를 만들 수 있는 모든 경우의 수(숫자 중복 제외)에 대하여 질문한 숫자와 비교해 스트라이크, 볼 갯수가 모두 일치한다면 카운트를 1증가 시키는 식으로 구현하였다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<pair<string, pair<int, int>>> answer;
int Solution()
{
int cnt = 0;
int strike, ball;
bool check;
for(int i=1; i<10; i++)
for (int j = 1; j < 10; j++)
{
if (j == i) continue;
for (int k = 1; k < 10; k++)
{
if (k == i || k == j) continue;
check = true;
for (vector<pair<string, pair<int, int>>>::size_type l = 0; l < answer.size(); l++)
{
strike = ball = 0;
for (int m = 0; m < 3; m++)
{
int number = answer[l].first[m] - '0';
if (i == number || j == number || k == number)
{
if (i == number && m == 0) strike++;
else if (j == number && m == 1) strike++;
else if (k == number && m == 2) strike++;
else ball++;
}
}
if (answer[l].second.first != strike || answer[l].second.second != ball)
{
check = false;
break;
}
if (strike == 3) return 1;
}
if (check)
cnt++;
}
}
return cnt;
}
int main(void)
{
int ans;
cin >> ans;
while (ans--)
{
string number;
int strike, ball;
cin >> number >> strike >> ball;
answer.push_back(make_pair(number, make_pair(strike, ball)));
}
cout << Solution() << endl;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
알고리즘 200일 프로젝트 - 18day
내일도 열심히!