난이도 : Silver 3
Link : https://www.acmicpc.net/problem/2503
Tag : 구현, 브루트포스 알고리즘
풀이일자 : 2024년 9월 18일
N : 질문의 개수
num : 질문한 숫자
strike : 위치,숫자 맞은 개수
ball : 숫자만 맞고 위치는 틀린 숫자 개수
정답이 가능한 개수는 1~9까지 숫자로 만들 수 있는 3가지 순열 방식이므로 10P3이 된다. 따라서 경우의 수는 720가지이다.
숫자에 대한 질문을 할때마다 경우의 수는 작아지므로 시간 복잡도 상 문제는 없을것으로 본다.
먼저 가능한 정답을 만들어줄 예정이다.
가능한 정답과 질문한 숫자로 만들 수 있는 숫자의 경우의 수들을 비교해서 strike와 ball 의 개수를 비교하여 실제로 맞을 수 있는 답안을 answer에 업데이트 해줄 예정이다.
import itertools
n = int(input())
answer = list(itertools.permutations(list(range(1,10)),3)) #정답 가능한 것
for i in range(n):
num, strike, ball = map(int, input().split())
guess = list(map(int,str(num)))
correct = []
for k_answer in answer:
tmp_strike, tmp_ball = 0, 0
for tmp in range(3):
if guess[tmp] == k_answer[tmp]: #strike 개수 구하기
tmp_strike += 1
if guess[tmp] != k_answer[tmp] and guess[tmp] in k_answer: #ball개수 구하기
tmp_ball += 1
if tmp_strike == strike and tmp_ball == ball:
correct.append(k_answer)
answer = correct #정답 가능한것 업데이트
print(len(correct))