브루트포스 알고리즘은 직역하면 "무식한 힘"이다. 모든 경우에 대해서 다루는 것이다. 그래서 이 방식으로 문제를 풀면 맞을 수는 있는데, 시간과 메모리의 제약에 걸리때는 못 쓰기도한다.
그냥 모든 경우를 탐색하면 된다. 입력에 대해 스트라이크와 볼의 개수를 주고, 우리는 111부터 999까지 하나씩 값을 비교하면서 모든 값을 사용한다. 값을 뽑는 것인 permutations와 for문으로 하나씩 뽑고, 받은 정보와 스트라이크 볼을 비교해서 정답 가능한 경우 ans에 카운트를 한다.
# 백준 2503번 숫자 야구
from itertools import permutations
N = int(input())
infos = [list(input().split()) for _ in range(N)]
ans = 0
# 1부터 9까지 중에서 3개만 뽑아서 순열을 만들고 하나씩 cur에 담는 것
for cur in permutations(range(1, 10), 3):
ok = True
# 한 값이 모든 조건에 동일하는지 보기위한 for문문
for num, st, ball in infos:
actual_st = 0 # 값의 실제 스트라이크 값
actual_ball = 0 # 값의 실제 볼 값
# 스트라이크, 볼 확인인
for i in range(3):
if num[i] == str(cur[i]): # st일때
actual_st += 1
elif str(cur[i]) in num: # ball일때
actual_ball += 1
# 결과값 대조 확인인
if actual_st != int(st) or actual_ball != int(ball):
ok = False
break # break를 쓰면 한 반복문만 벗어난다.
# 모든 입력값이 일치하면면
if ok:
ans += 1
print(ans)
permutation을 for문과 같이 사용해서 저렇게 쓸 수도 있다는게 놀라웠다. 피지컬이 좋은 사람들은 더 대단한 코드도 보여줄거라 생각한다.
이번 문제의 난이도는 실버 3인데, 아무리 생각해도 DFS/BFS, 다익스트라 알고리즘을 너무 올려치기 해주는 것 같다. 그건 느낌만 알면 웬만한 문제는 다 풀 수 있는데.