알고리즘

[백준] 2503 - 숫자야구

j9972 2023. 5. 15. 17:24
728x90

1. 문제

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

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

www.acmicpc.net

 

2. 접근

1. 처음에는 문제가 민혁이가 부르는 수가 몇 스트라이크, 몇 볼을 말하는 문제인지 알고 쉽다고 생각했지만, 그게 아니라 가능한 후보군들의 경우의 수를 구하는 문제라 나는 까다로웠다

2. 문제 3개의 숫자이고, 0은 3자리 중에 올수없고, 같은 수는 없다는 조건들로 check라는 배열을 만들어준다.

3. 데이터를 입력받고 , x,y에 대한 range(3)을 갖는 for문을 돌려서 같은 자리에 같은 값이 들어왔는지 혹은 같은 값만 들어왔는지에 따라서 s or b의 값을 증가 시켜준다

4. strike값과 s 혹은 ball값과 b이 같지 ㅇ낳으면 false 처리해준다

5. 배열에서 범위내의 값들 중 True의 갯수를 구하면 된다

 

3. 풀이

# 2503 실버3
import sys
input = sys.stdin.readline

n = int(input())

check = [True] * 1000

for i in range(123,1000):
    a = str(i)
    if a[0] == a[1] or a[2] == a[1] or a[2] == a[0]:
        check[i] = False
    if '0' in a:
        check[i] = False

for i in range(n):
    candidate, strike, ball = map(str, input().rstrip().split())

    for j in range(123,1000):
        s,b = 0,0
        for x in range(3):
            for y in range(3):
                if x==y and candidate[x] == str(j)[y]:
                    s += 1
                elif candidate[x] == str(j)[y]:
                    b += 1
        if int(strike) != s or int(ball) != b:
            check[j] = False

print(check[123:1000].count(True))