Algorithm(CodeTree, Python)/완전탐색3

[코드트리 기준을 새로 설정하여 완전탐색] 초기 수열 복원하기 Python

kurooru 2023. 1. 7. 11:58

상황에 따라 수열의 길이가 바뀌는 것을

어떻게 처리해줘야할지 고민하게 되었다.

recursion을 사용하지 않고 최대한 완전탐색답게 풀어보려 하였으나

quit() 함수를 사용하여 문제를 해결하였을 때의 이 찜찜함이란,, 

# n 입력
n = int(input())
# sum_list
sum_list = list(map(int, input().split()))

# 함수들
# is_duplicated(curr_num_list)
def is_duplicated(curr_num_list):
    
    # 전수 검사
    for i in range(n):
        
        # curr_num => 현재 기준이 되는 수
        curr_num = curr_num_list[i]

        for j in range(n):
            # 자기 자신이면
            if i == j:
                # pass
                continue
            # 자기 자신 외에 같은 수를 발견하면
            if curr_num_list[j] == curr_num:
                # 겹칩
                return True
    
    # 다 통과하면 안겹침
    return False

# only_plus(curr_num_list)
def only_plus(curr_num_list):
    # curr_num_list에서
    for num in curr_num_list:
        # 한개라도 0 이하가 있으면
        if num <= 0:
            # 실패
            return False
    # 다 통과하면 성공
    return True

# print_ans(curr_num_list)
def print_ans(curr_num_list):
    for num in curr_num_list:
        print(num, end=' ')

# 설계
for i in range(n):

    # curr_num_list
    curr_num_list = [
        0 for _ in range(n)
    ]

    # 첫 항 넣어주기
    curr_num_list[0] = i + 1
    
    # 둘째항부터 마지막 항까지 채워주기
    for j in range(1, n):
        curr_num_list[j] = sum_list[j-1] - curr_num_list[j-1]

    # 겹치지 않고, 0이나 음수가 없으면
    if not is_duplicated(curr_num_list) and only_plus(curr_num_list):
        # 정답 출력
        print_ans(curr_num_list)
        # 프로그램 종료
        quit()