실습 코드
# ------------------ Day4(25.06.13) ------------------
'''
SEND + MORE = MONEY
각 알파벳은 0~9까지 서로 다른 정수
S, M 은 가장 앞 자리로 0이 될 수 없음
'''
from ortools.sat.python import cp_model
model = cp_model.CpModel()
# 1. 변수 생성
letters = 'S E N D M O R Y'.split()
vars = {l: model.NewIntVar(0, 9, l) for l in letters}
# 2. 모든 알파벳은 서로 다름
model.add_all_different(vars.values())
# 3. S, M은 0이 아님
model.Add(vars['S'] != 0)
model.Add(vars['M'] != 0)
# SEND + MORE = MONEY
send = 1000 * vars['S'] + 100 * vars['E'] + 10 * vars['N'] + vars['D']
more = 1000 * vars['M'] + 100 * vars['O'] + 10 * vars['R'] + vars['E']
money = 10000 * vars['M'] +1000 * vars['O'] + 100 * vars['N'] + 10 * vars['E'] + vars['Y']
model.Add(send + more == money)
# 해 찾기
solver = cp_model.CpSolver()
status = solver.Solve(model)
if status == cp_model.FEASIBLE or status == cp_model.OPTIMAL:
for l in letters:
print(f'{l} = {solver.Value(vars[l])}')
print(f'send = {solver.Value(send)}')
print(f'more = {solver.Value(more)}')
print(f'money = {solver.Value(money)}')
else:
print('해를 찾을 수 없습니다.')
'''
S = 9
E = 5
N = 6
D = 7
M = 1
O = 0
R = 8
Y = 2
send = 9567
more = 1085
money = 10652
'''