코딩테스트/알고리즘 문제풀이

[파이썬] 2231 : 분해합

지과쌤 2021. 8. 12.
반응형

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

예제 입력 1 복사

216

예제 출력 1 복사

198


brute force 말고 뭔가 따로 알고리즘을 짤 수 있지 않을까... 계속 고민했지만, 그냥 이걸로 푸는게 제일 간단할것같다.

 

그냥 각 자리 숫자들을 string으로 뜯어서 int로 변환하며 더했다.

 

1000의 자리는 1000으로 나눠서 몫을 어쩌고 저쩌고... 아무리 n의 범위가 적당하게 주어졌다고 하지만 여러 경우로 나눠 몫을 더하는 코드는 너무 비효율적이지 않을까 생각했다.


class divSum :
    #brute force
    def isDivsum(self, n):
        for tempN in range(1, 1000001):
            self.divSum = 0
            #각 자리 숫자 하나하나 뜯어서 그냥 더하자. why? 몇째자리까지 있을지 어떻게 알고?
            for value in str(tempN):
                self.divSum += int(value)
            self.divSum += tempN
            if self.divSum==n:
                return tempN
            else :
                pass
        return 0

if __name__ == "__main__" :
    a = divSum()
    n = int(input())
    print(a.isDivsum(n))
반응형

'코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글

[파이썬] 1436 : 영화감독 숌  (0) 2021.08.30
[파이썬] 7568 : 덩치  (0) 2021.08.20
[파이썬] 2798 : 블랙잭  (0) 2021.08.08
[파이썬] 10872 : 팩토리얼  (0) 2021.07.28
[파이썬] 1002 : 터렛  (0) 2021.07.28

댓글

💲 추천 글