일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- php 프로그래밍 입문 솔루션
- php
- C
- 스프링
- 페이코 초대코드
- 파이썬
- JAVA SPRING
- 백준
- 페이코 추천인코드
- 페이코 친구코드
- 플러터 개발환경 설정
- 플러터
- php 프로그래밍 입문
- php 프로그래밍 입문 3판
- Java
- 배열
- 자바
- php 프로그래밍 입문 연습문제
- spring
- programmers
- C언어
- Flutter
- php 프로그래밍
- 페이코 추천인
- SWEA
- 한정 분기
- php 프로그래밍 입문 예제
- php 프로그래밍 입문 문제풀이
- 최단 경로
- 자바 스프링
- Today
- Total
ImJay
[파이썬/Python] 백준 2231번 분해합 본문
[파이썬/Python] 백준 2231번 분해합
문제
어떤 자연수 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)의 시간이 소요된다고 볼 수 있다.
참고자료
'Solved.ac - Python > CLASS 2' 카테고리의 다른 글
[파이썬/Python] 백준 2609번 최대공약수와 최소공배수 (2) | 2023.05.08 |
---|---|
[파이썬/Python] 백준 2292번 벌집 (0) | 2023.05.07 |
[파이썬/Python] 백준 2164번 카드2 (0) | 2023.05.07 |
[파이썬/Python] 백준 2108번 통계학 (0) | 2023.05.06 |
[파이썬/Python] 백준 1978번 소수 찾기 (0) | 2023.05.05 |