인프런 커뮤니티 질문&답변
안녕하세요 완전탐색 2503번 풀이 질문 드립니다
해결된 질문
작성
·
618
답변 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)





