문제
풀이 (Python)
n=int(input())
for i in range(1,n+2):
tmp,tmp_sum=str(i),0
for j in range(len(tmp)):tmp_sum+=int(tmp[j]) #각 자리수 더하기
tmp_sum+=i #입력받은 숫자를 더하기
if tmp_sum==n:break #생성자인 경우
if i>n:print(0) #생성자가 없는 경우 예외처리
else:print(i)
설명 (Python)
이 문제내용은 자연수 N이 있을 때, N의 각자릿수와 N을 더한 것을 분해합이라 한다.
예를 들어 N=41일 때, 34+3+4=41이므로 34는 생성자이다.
이 문제에서의 포인트는 생성자가 여러개일 수도 있으므로 제일 작은 생성자를 출력해야 하며,
생성자가 없는 경우에는 0을 출력해야 한다.
Point 1) for문을 통한 전체 브루트포스 검사
for i in range(1,n+2):
tmp,tmp_sum=str(i),0
for j in range(len(tmp)):tmp_sum+=int(tmp[j]) #각 자리수 더하기
tmp_sum+=i #입력받은 숫자를 더하기
if tmp_sum==n:break #생성자인 경우
자연수 n이 자기 자신이 생성자일 수 있으므로 범위를 n보다 크게 잡는다.
if문을 통해 중간에 생성자가 있는 경우 바로 break문으로 탈출 시에 가장 작은 수의 생성자이다.
Point 2) 데이터 형 변환
tmp,tmp_sum=str(i),0
for j in range(len(tmp)):tmp_sum+=int(tmp[j]) #각 자리수 더하기
str(i)를 통해 for문의 i인 자연수를 문자열로 변환시켜 준다. 파이썬에서 문자열은 리스트와 동일시하기 때문에 간단한 for문을 통해 각 리스트의 원소들을 int()를 통한 형변환으로 tmp_sum에 더해준다.
Point 3) 예외처리
if i>n:print(0) #생성자가 없는 경우 예외처리
else:print(i)
생성자가 없는 경우는 여러 가지가 있는데, 대표적으로는 일의 자리 수는 자기 자신의 2배의 값이 분해합이 되기 때문에 예외처리를 해주어야 한다. i> n의 의미는 위의 for문에서 i가 한 자리씩 더해지면서 진행한 후에 i값이 저장되어 있기에 일의 자릿수인 n보다 클 수밖에 없다.
이처럼 간단하게 예외처리를 진행할 수 있다.
분해합 문제는 문제를 풀이하는 데 사용되는 언어의 문법들을 잘 알 수 있도록 설계된 문제이다.
형변환에 대한 부분과 for문 이후 i변수의 값 유지 등을 알 수 있는 문제였다.
'Baekjoon' 카테고리의 다른 글
[백준] 10988번 팰린드롬인지 확인하기 (파이썬) (0) | 2024.01.12 |
---|---|
[백준] 1476번 날짜 계산 (파이썬) (0) | 2024.01.12 |
[백준] 1987번 알파벳 ( 파이썬) (0) | 2023.10.12 |
[백준] 10026번 적록색약 ( 파이썬 ) (0) | 2023.10.12 |
[백준] 2667번 단지번호붙이기 (파이썬) (0) | 2023.10.12 |