본문 바로가기
Algorithm(CodeTree, Python)/완전탐색1

[코드트리 자리 수 단위로 완전탐색] Carry 피하기 2 python

by kurooru 2022. 12. 2.
# n 입력
n = int(input())
# num_list
num_list = []
# num_list 입력
for _ in range(n):
    num_list.append(int(input()))

# 함수들
# is_carry(a, b, c)
def is_carry(a, b, c):
    
    # str_a, b, c
    str_a = str(num_list[a])
    str_b = str(num_list[b])
    str_c = str(num_list[c])

    # max_len 구하기
    max_len = max(len(str_a), len(str_b), len(str_c))

    # max_len에 맞춰 형식 변환 ex. "6" -> "0006"
    len_diff_a = max_len - len(str_a)
    str_a = '0' * len_diff_a + str_a
    len_diff_b = max_len - len(str_b)
    str_b = '0' * len_diff_b + str_b
    len_diff_c = max_len - len(str_c)
    str_c = '0' * len_diff_c + str_c

    # 자리수별 탐색 시작
    for i in range(max_len):
        # 한번이라도
        # 자릿수 3개를 더해 10이상이 나오면,
        if int(str_a[i]) + int(str_b[i]) + int(str_c[i]) >= 10:
            # True
            return True
    
    # 다 탐색하고 넘지 않았으면 False
    return False

# calc(a, b, c)
def calc(a, b, c):
    # 세 값을 더한 값 반환
    return num_list[a] + num_list[b] + num_list[c]

# 설계
# ans
ans = -1

# 완전 탐색 시작
for i in range(n-2):
    for j in range(i+1, n-1):
        for k in range(j+1, n):
            # carry가 발생하지 않으면,
            if not is_carry(i, j, k):
                # ans 업데이트
                ans = max(ans, calc(i, j, k))

# 출력
print(ans)