코딩테스트/백준

[백준][Python] 2231. 분해합

내만 2022. 7. 15. 16:21
728x90
반응형

 

 

 

 

 

 

🙆‍♂️문제


 

 

 

🙋‍♂️풀이


문제 요약 : 어떤 자연수 M이 있다면 M=245라고 가정했을 때 각 자리수의 합(245+2+4+5=256)을 분해합이라고 한다.

이 때 자연수 M을 분해합 N(256)의 생성자라고 한다. 분해합 N이 주어졌을 때 M이 될 수 있는 가장 작은 수를 찾아라.

 

🚀입력받기


n = int(input())

int형 값을 하나 입력 받습니다.

 

🚀 생성자 찾아서 배열에 넣기


decomDiv=[]
decomDiv.extend(str(n))

먼저 입력받은 값이 몇자리 수인지 구하는 배열을 만듭니다.

extend를 활용하여 1000이 입력되면 ["1","0","0","0"]이 배열에 입력되어서 4자리 수 임을 알게 됩니다.

 

자리 수를 체크하는 이유는 생성자를 구하는 최고의 경우의 수가 자리 수마다 다르기 때문입니다.

한 자리수당 최고로 많이 나올 수 있는 수가 9입니다.

그래서 n에 각 자리 수 만큼의 수와 9를 곱한 수를 뺀 수가 생성자가 될 수 있는 최소의 수입니다.

 

consts=[]
if n > 10:
    minusNum = len(decomDiv)*9
    for i in range(minusNum):
        decomM = n - i
        if decomM <= 0:
            decomM=0
        div=[]
        div.extend(str(decomM))
        intDiv = list(map(int,div))
        const = decomM+sum(intDiv)
        if const == n:
            consts.append(decomM)

우선 10 이하의 수들은 예외로 두고 extend함수를 적극 활용했습니다.

extend 함수는 str만 가능하기 때문에 사용할 때 형변환을 해주고 다시 더할 때 int로 형변환을 해줘야 합니다.

그렇게 해서 구한 생성자들을 consts 배열에 입력합니다.

 

else:
    if n%2==0:
        consts.append(n//2)

10 이하의 경우는 짝수만 생성자를 갖고 있습니다. 그래서 짝수에 생성자 처리를 이렇게 했습니다.

 

 

🚀 출력하기


if len(consts)==0:
    consts.append(0)
print(min(consts))

출력할 때는 위에서 값을 넣었던 consts 배열 중 최소 값을 출력하기 위해 min함수를 사용했고

만약 consts 배열에 아무 값도 들어가 있지 않다면(생성자가 없는 수 였다면)

0을 넣어서 0을 출력하도록 합니다.

 

 

 

728x90
반응형