0%

BOJ 2503

Input

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다.

이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
input = sys.stdin.readline

num = [] # string
s = []
b = []

t = int(input().strip())
ret = [False]*1000

for _ in range(t):
temp_num, temp_s, temp_b = map(int, input().split())
num.append(str(temp_num))
s.append(temp_s)
b.append(temp_b)

Brute Force

완전 탐색을 어떻게 접근해야 하는지 감을 잡았다. 중첩 반복문의 끝이라 런타임 에러든 뭐든 틀릴 줄 알았는데 맞아서 쩌매 당황;;

이 문제는 1~9 중 서로 다른 digit number을 가진 3자리 자연수 중 strike , ball 을 만족시키는 경우를 고르면 된다.

  • 일단 가능한 경우의 숫자를 모두 만들어놓고

    1
    2
    3
    4
    5
    for i in range(1, 10):
    for j in range(1, 10):
    for k in range(1, 10):
    if i != j and j != k and i != k:
    ret[i*100 + j*10 + k] = True
  • 여기서 조건에 맞는 경우는 남기고 아닌 경우는 제외시키면 됨

    1
    2
    if strike != s[idx] or ball != b[idx]:
    ret[t] = False
    • strike: 숫자도 위치도 같은 경우

      1
      2
      if temp[d] == now[d]:
      strike += 1
    • ball: 숫자는 같되 위치가 다른 경우

      1
      2
      elif now.count(temp[d]) > 0:
      ball += 1

Output

첫 줄에 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.

  • True False 를 이용했기 때문에 sum 을 이용하면 바로 len 을 출력할 수 있음

    1
    print(sum(ret))