반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-17 03:37
관리 메뉴

ImJay

[파이썬/Python] 백준 2231번 분해합 본문

Solved.ac - Python/CLASS 2

[파이썬/Python] 백준 2231번 분해합

ImJay 2023. 5. 7. 05:46
반응형

[파이썬/Python] 백준 2231번 분해합

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net


문제

어떤 자연수 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을 출력한다.

예제 입력

216

예제 출력

198

풀이

import sys
input = sys.stdin.readline

# 입력
n = int(input())

for i in range(n):
    # 분해합 공식
    digit_sum = i + sum(map(int, str(i)))
    # 생성자일 경우
    if digit_sum == n:
        print(i)
        break
else:
    print(0)

이 코드는 입력값 N의 자리수 합과 같은 수 중에서 가장 작은 수를 찾는 문제를 해결하는 코드이다.

코드를 간단히 살펴보면, 0부터 N-1까지의 수를 순차적으로 검사하면서 각 숫자의 자리수 합과 숫자 자신의 합이 N과 같은지 검사하고, 이 조건이 만족되는 숫자를 출력한다. 만약 이러한 숫자가 존재하지 않는다면, 0을 출력한다.

시간 복잡도는 입력값 N에 비례한다. 범위가 0부터 N-1까지이므로, 반복문은 N번 실행된다. 각 반복마다, 해당 숫자의 자리수 합을 계산하는 데 O(logN)의 시간이 소요된다. 따라서, 전체적인 시간 복잡도는 O(NlogN)이다.

숫자의 자리수 합을 계산하는 부분에서 O(logN)의 시간이 소요된다. 이는 다음과 같은 이유로 설명할 수 있다.

우선, 숫자 i를 문자열로 변환하면, 문자열의 길이는 i의 자리수에 비례한다. 예를 들어, i가 123이면, str(i)는 "123"이 되고, 이 문자열의 길이는 3이다.

그런 다음, map 함수를 사용하여 문자열 str(i)의 각 자리 숫자에 대해 int 함수를 적용하여 정수형 리스트를 만든다. 이 리스트는 i의 자리수와 같은 길이를 가지며, 리스트의 요소들은 모두 0부터 9까지의 정수값을 가진다.

마지막으로, sum 함수를 이용하여 정수형 리스트의 모든 요소의 합을 계산한다. 이 과정에서, 리스트의 길이에 비례하는 O(logN)의 시간이 소요된다. 따라서, 숫자의 자리수 합을 계산하는데 O(logN)의 시간이 소요된다고 볼 수 있다.

참고자료

 

[python] 파이썬 각 자리수 분리, 더하기

파이썬에서 각 자리숫자를 분리하는 방법은 여러가지가 있으며, 소개해드릴 방법은 문자열로 변환 후 분리하는 방법, 10으로 나누어서 수행하는 방법, map함수를 이용하여 자리수 별 더하는 방법

go-hard.tistory.com

반응형
Comments