Algorithm (PS)

[백준] 20164번 : 홀수 홀릭 호석 (파이썬/Python) - 구현, 브루트포스

minjiwoo 2022. 12. 9. 17:28
728x90

https://www.acmicpc.net/problem/20164

 

20164번: 홀수 홀릭 호석

호석이는 짝수랑 홀수 중에서 이니셜이 같은 홀수를 더 좋아한다. 운전을 하던 호석이는 앞차의 번호판이 홀수로 가득할 때 사랑스러움을 느낄 정도이다. 전화번호도 홀수만 있고 싶다. 그렇게

www.acmicpc.net

구현문제이다 

또한 별 다른 알고리즘 없이, 세자리 이상인 경우에도 가능한 숫자 조합을 이중 for문으로 모두 만들어 주고 다시 호출했다 
그렇지만...!! 내가 놓친부분은 바로 새로운 숫자 조합을 만들 때에도 홀수의 개수를 세는 것이다 ... 

def check_odd(n):
    # 1. 각 자리 숫자 중 홀수의 개수를 적는다.
    temp = 0
    for i in n:
        if int(i) % 2 == 1:
            temp += 1
    return temp

 check_odd는 하나씩 홀수의 개수를 세어주는 함수이다. n은 문자열로 처리하는 것이 편해서 문자열로 처리하고 있으며, int()로 형변환을 한 후 홀수의 개수를 하나씩 세어주고 있다. 

문제에서 빨간 동그라미를 쳐준 것이 바로 check_odd() 함수가 하는 일이다..
간단한 걸 놓쳐서 엄청 삽질을 했다 ㅠㅠ

import sys
n = sys.stdin.readline().strip()
min_value = int(1e9)
max_value = 0

# 한자리 숫자일 때
def check_odd(n):
    # 1. 각 자리 숫자 중 홀수의 개수를 적는다.
    temp = 0
    for i in n:
        if int(i) % 2 == 1:
            temp += 1
    return temp

# n is string
def solve(n, count):
    global min_value, max_value

    if len(n) == 1: # 2. 수가 한자리 , then 종료
        min_value = min(count, min_value)
        max_value = max(count, max_value)
        return

    elif len(n) == 2: # 3. 두자리 수 는 2개로 나눠서 합 , 새로운 수 생성
        new = str(int(n[0]) + int(n[1])) # 새로운 수 생성 
        return solve(str(new), count+check_odd(new)) # 재귀 호출, 새로운 숫자에 있는 홀수 개수를 누적해서 더함 

    else: # 세자리 이상인 경우
        # 어떻게 나누지 ?
        new_num = 0
        for i in range(0, len(n)-2):
            for j in range(i+1, len(n)-1):
                # 나머지는 k
                first = n[:i+1]
                second = n[i+1:j+1]
                third = n[j+1:]
                new_num = str(int(first) + int(second) + int(third)) # 새로운 숫자 만들기
                solve(new_num, count+check_odd(new_num)) # 새로운 숫자에 있는 홀수 개수 카운트를 누적해서 더함.

x = check_odd(n)
solve(n, x)
print(min_value, max_value)
728x90