본문 바로가기
Algorithm/DFS&BFS&백트래킹&재귀

[백준] 2503번 숫자 야구 (재귀함수)

by HANNI하니 2023. 10. 30.

사용 언어 - Python3

문제 -  2503번 숫자 야구

 

2503번: 숫자 야구

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

www.acmicpc.net

 

정답

1. 완전 탐색으로 푼 풀이 

https://rladuddms.tistory.com/386

 

[백준] 2503번 숫자 야구

사용 언어 - Python3 문제 - 2503번 숫자 야구 2503번: 숫자 야구 첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는

rladuddms.tistory.com

 

2. 재귀함수로 푼 풀이

sys.setrecursionlimit(9999999)

파이썬 천번정도 반복하면 멈추기 때문에, 더 돌리기

 

 

def recur(hint_idx,number)

해당 number를 힌트 전부 확인하면서 통과하는지 아닌지 확인해준다.

세 자리 숫자이기 때문에 number = 100 부터 시작

hint_idx는 0부터 n-1개 반복

 

- 힌트 통과했다면, 다음 힌트에서도 통과하는지 확인 recur(hint_idx+1, number)

- 힌트 통과하지 못했다면, number를 변경 number+1로 변경 recur(0,number+1)

- 힌트 전부 다 통과했다면, 정답 추가 answer += 1 후 number 변경 후 처음부터 돌리기 recur(0,number+1)

- 백의 자리의 모든 number 돌렸다면, return

print(answer)

 

 

def checker(hint_idx,number)

힌트 통과 여부를 확인해주는 함수

- 힌트 값과 현재 number 값(백/십/일의 자리 값) 비교

- 각 숫자는 1부터 9라고 했으므로 0일 경우 False

- 각 숫자는 겹치지 않으므로 겹칠 경우 False

- strike와 ball 개수가 같다면, 힌트 통과했으므로 True

- 아닌 모든 경우는 False

 

 

import sys
# 파이썬 천번정도 반복하면 멈추기 때문에, 더 돌리기
sys.setrecursionlimit(9999999) 

def checker(hint_idx,number):
    _number = hint[hint_idx][0]
    _strike = hint[hint_idx][1]
    _ball = hint[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: # 1부터 9까지의 숫자임
        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(hint_idx,number):
    global answer
    
    if hint_idx == n:
        answer += 1
        recur(0,number+1) #number 바꿔주고 다시 힌트 0부터 돌리기
        return
    if number == 1000: # 끝
        return
    
    # 만약에 힌트에 통과했다면(스트라이크, 볼 카운트가 동일하다면)
    if checker(hint_idx,number):
        # 같은 number에서 다른 힌트도 통과하는지 보기
        recur(hint_idx+1,number)
    # 만약에 힌트에 통과하지 않았다면,
    else:
        recur(0,number+1) #number 바꿔주고 다시 힌트 0부터 돌리기
        
n = int(input())
hint = [list(map(int,input().split())) for _ in range(n)]
answer = 0
recur(0,100)
print(answer)

 

 

 

레퍼런스

  • 깃허브 정답

https://github.com/yyeongeun/codingtest/blob/main/BAEKJOON/2503_%EC%88%AB%EC%9E%90%EC%95%BC%EA%B5%AC1.py

 

댓글