https://www.acmicpc.net/problem/2503
1. 재귀풀이
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, _B, _C = str(_number)
# 검사할 세자리수
A, B, C = str(number)
# 1부터 9까지의 수여야만 함!
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(hint_idx, number):
global ans
# 네자릿수가 된다면(모든 세자리 수를 탐색했다면)
if number == 1000:
return
# 힌트를 모두 통과한 경우 (정답 후보)
if hint_idx == n:
ans += 1
recur(0, number + 1 )
return
# 힌트에 통과했다면
if checker(hint_idx, number):
recur(hint_idx+1, number)
# 힌트에 통과하지 못했다면 -> 다른 수로 탐색 시작
else:
recur(0, number+1)
n = int(input()) # 질문 갯수
hint = [list(map(int, input().split())) for _ in range(n)]
ans = 0
recur(0, 100)
print(ans)
2. 반복문 풀이
import sys
input = sys.stdin.readline
n = int(input())
num = [i for i in range(100, 1000)] # 100~999
cnt = 0
for i in range(n):
hint, hint_strike, hint_ball = map(int, input().split())
for j in range(len(num)): # 모든 자연수 순회할 것
strike, ball = 0, 0
tmp = str(num[j]) # 검사하는 수
if (tmp == '0'): # !이미 최상단 반복문에서 돌았을 때! 0으로 치환된 수면 넘기기
continue
if ((tmp[0] == tmp[1] or tmp[0] == tmp[2] or tmp[1] == tmp[2]) or ('0' in tmp)): # 중복되는 수가 있거나 0이 있으면
num[j] = 0 # 조건을 만족하지 않으므로 0으로 치환 -> 나중에 갯수세서 뺄 것
else:
hint = str(hint) # 문자열로 변환
for k in range(3):
for l in range(3):
if (tmp[k] == hint[l] and k == l): # 숫자도 같고 위치도 같으면
strike += 1
elif (tmp[k] == hint[l] and k != l): # 숫자는 같은데 위치가 다르면
ball += 1
if (strike != hint_strike or ball != hint_ball): # 스트라이크와 볼의 갯수가 다르면
num[j] = 0 # 조건을 만족하지 않으므로 0으로 치환
print(900 - num.count(0)) # 조건을 만족하지 않아 0으로 치환한 갯수를 빼줌
-> 반복문 풀이가 1.5배정도 더 느림.
if (tmp == '0'): # !이미 최상단 반복문에서 돌았을 때! 0으로 치환된 수면 넘기기
continue
이부분을 빼면 런타임(인덱스)에러가 나서 왜그런지 머리빠지게 고민해봤더니...
for j 반복문은 순차적으로 돌기 때문에 0으로 치환된 num이 있을 수가 있나? 라고 착각했지만
그 상단의 for i 반복문에서 0으로 치환된 num이 있을 수 있다...
num은 전역변수라 반복문을 돌면서 초기화되지 않기 때문에...!!
'백준' 카테고리의 다른 글
백준 12865. 평범한 배낭 (0) | 2024.10.23 |
---|---|
백준 2961. 도영이가 만든 맛있는 음식 (0) | 2024.10.20 |
백준 15649. N과 M (1) (0) | 2024.10.20 |
백준 2304. 창고 다각형 (0) | 2024.10.15 |
백준 21921. 블로그 (0) | 2024.04.17 |