https://programmers.co.kr/learn/courses/30/lessons/42841
접근
그냥 완전 탐색입니다. 숫자야구는 프로그래밍 기초단계 배울 때 많이 접하는 것 같습니다.
다만 숫자 야구 룰을 모르면 약간 문제를 오독 할 수 있습니다. 문제에서
'각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.'
라는 문장의 첫 부분을 보면 각 자리의 숫자가 서로 중복이 안된다는 것인지, 각자의 숫자가 중복이 안된다는 것인지 약간 햇갈립니다. 저만 그랬을수도 있지만요...
각 자리의 숫자는 중복이 불가능 하므로 1,2,3,4,5,6,7,8,9에서 3개를 뽑는 순열 9P3 을 하면 됩니다.
구현
가능한 모든 순열을 고려하면서 각 순열에 대하여 모든 질문에 부합하는지 검사하면 됩니다.
먼저 스트라이크 부터 판단하면,
자리수와 숫자가 모두 일치하는지 보고, 그러한 숫자가 몇가지 있는지 보면 됩니다.
만약 모두 일치하는 숫자가 스트라이크 숫자와 다르다면 해당 질문에 부합하지 않는다고 판단하여 그 순열은 정답이 될수 없다고 판단합니다.
이때 중요한건 볼을 판단하기 위해서는 스트라이크라고 판단 된 숫자는 고려하지 않아야 합니다. 따라서 스트라이크라고 판단된 숫자는 -1로 처리했습니다.
볼 판단은 스트라이크로 걸러진 숫자가 아니라면 다른 자리의 숫자 2개와 숫자가 동일한지 보면 됩니다.
스트라이크와 마찬가지로 볼에 해당하는 숫자는 몇개 인지 카운트해서 질문의 볼 숫자와 비교합니다.
다음은 코드 전문입니다.
from itertools import permutations
def solution(baseball):
answer = 0
res = []
num = ['1','2','3','4','5','6','7','8','9']
permute = permutations(num,3)
for n in permute:
isCorrect = True
for q in baseball:
temp = list(n)
temp_q = str(q[0])
co_str = 0
co_ball = 0
for i in range(3): # is strike?
if temp_q[i] == temp[i]:
co_str += 1
temp[i] = '-1'
if co_str != q[1]:
isCorrect = False
break
for i in range(3):
if temp[i] == '-1':
continue
if temp[i] == temp_q[(i+1)%3] or temp[i] == temp_q[(i+2)%3]:
co_ball += 1
if co_ball != q[2]:
isCorrect = False
break
if not isCorrect:
continue
else:
res.append(n)
answer = len(res)
return answer