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')
'알고리즘💻 > Bruteforce&Backtracking' 카테고리의 다른 글
BOJ 4673번: 셀프 넘버 (0) | 2023.09.13 |
---|---|
BOJ 2026번: 소풍 (0) | 2021.07.27 |
BOJ 2239번: 스도쿠 (0) | 2021.07.25 |
BOJ 1182번: 부분수열의 합 (0) | 2021.07.25 |
BOJ 14889번: 스타트와 링크 (0) | 2021.07.25 |