알고리즘

[백준/파이썬] #20164

룰루루 2025. 3. 14. 22:31

30분 안에 풀지는 못했지만 이전에 시도한 풀이를 가져와봤다. 

from itertools import combinations

original_number = input()


def count_odd_numbers(number: str):
    odd_count = 0
    for num in number:
        if int(num) % 2 == 1:
            odd_count += 1

    if len(number) == 1:
        return odd_count, odd_count
    elif len(number) == 2:
        new_number = int(number[0]) + int(number[1])
        max_count, min_count = count_odd_numbers(str(new_number))
        return max_count + odd_count, min_count + odd_count
    else:
        max_count, min_count = 0, 0
        number_indexes = ''.join([str(i) for i in range(len(number))])
        number_cases = combinations(number_indexes, 3)
        for number_case in number_cases:
            start1, start2, start3 = int(number_case[0]), int(number_case[1]), int(number_case[2])
            number1 = int(''.join(number[start1:start2]))
            number2 = int(''.join(number[start2:start3]))
            number3 = int(''.join(number[start3:]))
            new_number = number1 + number2 + number3
            current_max_count, current_min_count = count_odd_numbers(str(new_number))
            max_count = max(current_max_count, max_count)
            min_count = min(current_min_count, min_count)
        return max_count + odd_count, min_count + odd_count


max_value, min_value = count_odd_numbers(original_number)
print(f"{min_value} {max_value}")

 

다른 풀이를 참고하니 재귀나 itertools 라이브러리로 경우의 수를 구해서 접근하는 방식은 비슷했던 것 같다. 다만 함수를 호출하거나 리턴값을 받는 방식이 달랐는데, 이 부분 때문에 결과가 제대로 계산 또는 반영되지 않은 것일 수 있겠다. 

from itertools import combinations

original_number = input()
max_value = -1e5
min_value = 1e5


def count_odd_numbers(number: str):
    odd_count = 0
    for num in number:
        if int(num) % 2 == 1:
            odd_count += 1
    return odd_count


def solution(number: str, odd_count: int):
    global max_value, min_value

    if len(number) == 1:
        max_value = max(max_value, odd_count)
        min_value = min(min_value, odd_count)
    elif len(number) == 2:
        new_number = str(int(number[0]) + int(number[1]))
        solution(new_number, odd_count + count_odd_numbers(new_number))
    else:
        number_indexes = ''.join([str(i) for i in range(len(number))])
        number_cases = combinations(number_indexes, 3)
        for number_case in number_cases:
            start1, start2, start3 = int(number_case[0]), int(number_case[1]), int(number_case[2])
            number1 = int(''.join(number[start1:start2]))
            number2 = int(''.join(number[start2:start3]))
            number3 = int(''.join(number[start3:]))
            new_number = str(number1 + number2 + number3)
            solution(new_number, odd_count + count_odd_numbers(new_number))

solution(original_number, count_odd_numbers(original_number))
print(f"{min_value} {max_value}")