예전에 많이 하던 숫자 야구 구현이다.
숫자가 3개밖에 없기 때문에 브루트포스를 사용하지만 그 구현방법이 어려웠다.
문제 조건이 1~9까지의 숫자 사용. 각 자리수는 서로 다른 숫자이기 때문에 123~999 사이에서
1. 0 이 들어가거나 2. 자리수가 같은 경우가 있는 경우는 배제하고 시작한다.
그 후에 strike와 ball수를 체크해서 모든 조건을 통과하는 숫자들의 경우의 수를 리턴한다.
따라서 처음에 모든 배열을 0으로 초기화하고 조건에 만족하지 않을 때마다 배열 값을 1로 바꾼다.
최종적으로 배열값이 0인 경우만 답으로 리턴한다.
숫자 자리값비교 -> to_string사용!
10으로 나눠서 자리값을 비교하기엔 귀찮다... to_string(int)를 사용하여 자리수를 편하게 비교하자. (string헤더에 있다)
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int arr[1000];
int n, m, s, b;
int s_cnt, b_cnt;
string cmp, tmp;
int main(void)
{
scanf("%d", &n);
for (int j = 123; j < 1000; j++)
{
tmp = to_string(j);
if (tmp[0] == tmp[1] || tmp[0] == tmp[2] || tmp[1] == tmp[2])
{
arr[j] = 1;
}
if (tmp[0] - '0' == 0 || tmp[1] - '0' == 0 || tmp[2] - '0' == 0)
{
arr[j] = 1;
}
}
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &m, &s, &b);
if (s == 3)
{
printf("1\n");
return 0;
}
cmp = to_string(m);
for (int j = 123; j < 1000; j++)
{
if (arr[j])
continue;
s_cnt = 0, b_cnt = 0;
tmp = to_string(j);
for (int x = 0; x < 3; x++)
{
for (int y = 0; y < 3; y++)
{
if (x == y && cmp[x] == tmp[y])
{
s_cnt++;
}
if (x != y && cmp[x] == tmp[y])
{
b_cnt++;
}
}
}
if (s_cnt != s || b_cnt != b)
{
arr[j] = 1;
}
}
}
int result = 0;
for (int i = 123; i < 1000; i++)
{
if (arr[i] == 0)
result++;
}
printf("%d\n", result);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 19947] 투자의 귀재 배주형 (0) | 2020.11.26 |
---|---|
[백준 17626] Four Squares (0) | 2020.11.26 |
[백준 5639] 이진검색트리 (0) | 2020.11.24 |
[백준 16945] 매직 스퀘어로 변경하기 (0) | 2020.11.23 |
[백준 15779] Zigzag (0) | 2020.11.23 |
댓글