OR-Tools Day4

개발공부를해보자·2025년 6월 13일

실습 코드

# ------------------ 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
'''
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글