즐거운 PS 👩‍💻🥰

[백준-파이썬] 20164: 홀수 홀릭 호석

dalin❤️ 2021. 10. 8. 10:13

문제 보러 가기~~

아이디어 🤩

몇 자리 숫자가 들어오는지에 따라서 다른 행동을 하라고 했다.
그래서 숫자(단, str 형식으로 입력받음)와 그때까지 더한 홀수의 합을 받아서, 특정한 행동을 하는 함수를 만들었다. 몇 자리인지에 따라서 다른 행동을 하고, 한 자리가 되어서 종료될 때까지 재귀로 계속 돌린다.

  1. 한 자리 -> 그때까지의 홀수의 개수를 리스트에 추가하고 리턴! (나중에 최대 홀수의 개수, 최소 홀수의 개수를 출력한다.)
  2. 두 자리 -> 그 수를 두 개로 나눠서 합을 구해서 새로운 수로 생각한다. (12면 1과 2로 나눈다. -> 1+2를 해서 3을 새로운 수로 생각하기)
    => 새로운 수, 그때까지 홀수의 합 + 이 새로운 수에 들어간 홀수의 개수를 인자로 주어서, 또 함수에 넣는다.
  3. 세 자리 이상 -> 임의의 위치에서 끊어서 세 개의 수로 나눈다. 합을 구해서 새로운 수로 생각한다. 이 임의의 위치는 일일이 다 따져보았다.
    예를 들어서 12345이면..
    1) 1 2 345 => 각 수를 더하면 348
    2) 1 23 45 => 각 수를 더하면 69
    3) 1 234 5 => 각 수를 더하면 240
    4) 12 3 45 => 각 수를 더하면 60
    5) 12 34 5 => 각 수를 더하면 51
    6) 123 4 5 => 각 수를 더하면 132를 새로운 수로 생각할 수 있다.
    => 새로운 수, 그때까지 홀수의 합 + 이 새로운 수에 들어간 홀수의 개수를 인자로 주어서, 또 함수에 넣는다.

코드 👩‍💻

def new_num_sum(num:int):
    """
    숫자의 각 자리수에서 홀수의 개수를 리턴한다
    """
    new_num_total = 0
    while num:
        if (num % 10) % 2: # 홀수이면
            new_num_total += 1   
        num//=10
    return new_num_total


def sol(n: str, total: int): # 지금 수, 지금까지 홀수의 개수
    if len(n) == 1: # 수가 한 자리이면 종료
        makes.append(total) # 그때까지의 홀수의 개수를 리스트에 추가
        return

    elif len(n) == 2: # 수가 두 자리이면
        new_num = int(n[0]) + int(n[1]) # 2개로 나누고, 더해서 새로운 수로 생각하기
        sol(str(new_num), total + new_num_sum(new_num))

    else: # 수가 세 자리 이상이면
        for i in range(1, len(n)): # 자를 위치 2개
            for j in range(i+1, len(n)):
                part1 = n[:i]
                part2 = n[i:j]
                part3 = n[j:]

                new_num = int(part1) + int(part2) + int(part3) # 3개의 수로 나누고, 더해서 새로운 수로 생각하기
                sol(str(new_num), total + new_num_sum(new_num))

N = input()
makes =[]
sol(N, new_num_sum(int(N)))
print(min(makes), max(makes))
728x90