해결된 질문
작성
·
557
답변 1
0
안녕하세요!
3일 째 스스로 숙제
가 어느 부분을 말씀하시는 것 인지 모르겠습니다..
제 강의에서 다루는 숫자야구의 2가지 풀이법을 올려두겠습니다 :)
참고해서 정답 비교해보시고, 그래도 어려우시면 제출하신 코드를 여기에 올려주세요!
완전탐색(브루트포스)
n = int(input())
numbers = [list(map(str,input().split())) for _ in range(n)]
# string을 미리 넣어준 이유는, 나중에 쪼개기 위해서
answer = 0
# (1) 세 자리 숫자 만들기
for a in range(1,10): # 100의 자리수
for b in range(1,10): # 10의 자리수
for c in range(1,10): # 1의 자리수
counter = 0
# (2) 다른 세 자리수
if( a == b or b == c or c == a):
continue
# continue, 그 숫자를 넘김
# break, 반복문을 넘김
# (3) 배열에 넣은 조건을 넣어주기
for array in numbers:
check = list(array[0]) # ['1','2','3']
strike = int(array[1])
ball = int(array[2])
strike_count = 0
ball_count = 0
#스트라이크 계산기
if (a == int(check[0])):
strike_count += 1
if (b == int(check[1])):
strike_count += 1
if (c == int(check[2])):
strike_count += 1
#볼 계산기
if (a == int(check[1]) or a == int(check[2])):
ball_count += 1
if (b == int(check[0]) or b == int(check[2])):
ball_count += 1
if (c == int(check[0]) or c == int(check[1])):
ball_count += 1
#(4) 매칭 여부 확인하기
if (strike != strike_count):
break
if (ball != ball_count):
break
counter += 1
if counter == n:
answer += 1
print(answer)
재귀(백트래킹)
import sys
sys.setrecursionlimit(9999999)
def checker(idx,number):
_number = hint[idx][0]
_strike = hint[idx][1]
_ball = hint[idx][2]
strike = 0
ball = 0
_A = _number // 100
_B = (_number - (_A * 100)) // 10
_C = _number % 10
A = number // 100
B = (number - (A * 100)) // 10
C = number % 10
if A == 0 or B == 0 or C == 0:
return False
if A == B or A == C or B == C:
return False
if A == _A:
strike+= 1
if B == _B:
strike+= 1
if C == _C:
strike+= 1
if A == _B or A == _C:
ball += 1
if B == _A or B == _C:
ball += 1
if C == _A or C == _B:
ball += 1
if strike == _strike and ball == _ball:
return True
return False
def recur(idx, number):
global answer
if idx == n:
answer += 1
# print(number)
recur(0, number+1)
return
if number == 1000:
return
if checker(idx,number):
recur(idx+1, number)
else:
recur(0, number+1)
n = int(input())
hint = [list(map(int,input().split())) for _ in range(n)]
answer = 0
recur(0, 100)
print(answer)