알고리즘💻/Bruteforce&Backtracking
BOJ 15811번: 복면산?!
호프
2021. 7. 28. 14:33
https://www.acmicpc.net/problem/15811
15811번: 복면산?!
복면산이란 수학 퍼즐의 일종으로, 어떤 계산식의 각 숫자들을 특정 문자로 바꾸면 각 문자가 어떤 숫자인지 맞추는 퍼즐이다. 대표적으로 SEND+MORE=MONEY가 있다. SEND + MORE ------ MONEY S=9, E=5, N=6, D=7,
www.acmicpc.net
DFS 재귀를 이용해서 구현을 했는데 시간초과가 났다. 아예 처음부터 순열을 구해서 부르트포스로 풀면 되는 문제였다.
처음에 접근할 때는 넣을 때부터 덧셈의 결과를 맞춰보려고 생각하다가 막혔는데.. 너무 어렵게 생각했던 것 같다. 각 문자마다 다른 숫자여야 하므로 전체 문자의 개수를 구해 0~9까지 그 개수에 맞게 순열을 뽑으면 된다.
python은 시간초과.. pypy로 통과했다. 숫자가 주어졌을 때 자리수에 맞춰서 합치는 방법을 잘 기억해놓고.. 제발 for i in range 할 때 range 빼 먹지 말자... 하..
import sys
from itertools import permutations
input = sys.stdin.readline
a, b, c = input().split()
alphabet = sorted(list(set(a+b+c)))
num = [x for x in range(10)]
score = [-1]*26
flag = False
for k in permutations(num, len(alphabet)):
for i in range(len(alphabet)):
score[ord(alphabet[i])-65] = k[i]
A = B = C = 0
for i in range(len(a)):
A = A*10 + score[ord(a[i])-65]
for i in range(len(b)):
B = B*10 + score[ord(b[i])-65]
for i in range(len(c)):
C = C*10 + score[ord(c[i])-65]
if (A+B == C):
print('YES')
flag = True
break
if (flag==False):
print('NO')