사용 언어 - Python3
문제 - 2503번 숫자 야구
정답
1. 완전 탐색으로 푼 풀이
https://rladuddms.tistory.com/386
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)
레퍼런스
- 깃허브 정답
'Algorithm > DFS&BFS&백트래킹&재귀' 카테고리의 다른 글
[백준] 19942번 다이어트 (1) | 2023.10.30 |
---|---|
[백준] 2961번 도영이가 만든 맛있는 음식 (1) | 2023.10.30 |
[백준] 수열 - 재귀함수 구현 정리 (2) (0) | 2023.10.30 |
[백준] 수열 - 재귀함수 구현 정리 (1) (0) | 2023.10.30 |
[프로그래머스 lv3] 여행경로 (1) | 2023.04.22 |
댓글