본문 바로가기
알고리즘 문제풀이/백준

[백준 2503] 숫자 야구

by m2162003 2020. 11. 26.

www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

 

예전에 많이 하던 숫자 야구 구현이다.

숫자가 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;
}

댓글