일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- Spring Framework
- 머신러닝
- 다이나믹프로그래밍
- DP
- 시애틀
- 모두를 위한 딥러닝
- spring
- 라인플러스
- 알고리즘
- Java
- 벤쿠버
- 릿코드
- 스프링 프레임워크
- 백준
- STL
- 백트래킹
- dfs
- C++
- 파이썬
- BFS
- leetcode
- 라인
- 프로그래밍언어론
- 프로그래머스
- 스타벅스
- jvm
- binary search
- 딥러닝
- C/C++
- Today
- Total
케이스윔의 개발 블로그
[백준 알고리즘][완전탐색] 223번 분해합 본문
문제 정의
어떤 자연수 N이 있을 때, 그 자연수의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들면 245의 분해합은 245+2+4+5=256이되고, 256의 생성자는 245가 된다. N이 주어졌을 때 가장 작은 생성자를 구해내는 프로그램을 작성해야한다.
문제 출처: 백준 온라인 저지(https://www.acmicpc.net/problem/2231)
문제 풀이
어떤 수를 분해시켜 N과 N을 이루는 각 자리수의 합을 계산했을 때, 입력한 숫자가 나와야하고 그 어떤 수 중에서 가장 작은 수를 구해야한다. 만약 주어진 자연수 N을 만들기 위해서 모든 수를 다 분해합 시킨다고 생각하면, 1,000,000을 만들기 위해서는 약 999,000 대의 숫자에서 주어진 자연수의 생성자를 찾아야한다. 이 정도의 수면 큰 수인가? 일단 시간 제한이 2초니까 무식하게 모든 분해합을 만들어보는 코드로 작성해본다.
분해합을 만들기 위해 생각해봐야하는 부분은 숫자가 들어왔을 때 각 자리수를 어떻게 나눌 것인지 이다. 만약 123이 들어오면 1+2+3+123이 되도록 해야하는데 몇자리수가 들어올지 모르니 일단 들어오는 수를 10으로 계속 나눈다. 그리고 나누면서 나머지는 각 자리의 합으로 더한다. 123/10->12가 되면서 3더하기 12/10 ->1이 되면서 2더하기 1/10->1보다 작을 경우 반복문이 종료되게한다.
*한번에 반복문 조건 클리어해서 풀었다.
코드
#include<stdio.h>
int N;
void main()
{
int i, j;
int result = 0;
scanf("%d", &N);
for(i=1; i<=N; i++)
{
j = i;
result = 0;
while( j/10 != 0)
{
result += j%10;
j = j/10;
}
result += j;
result = result + i;
if(result == N)
break;
if(i==N){
i=0;
break;
}
}
printf("%d\n", i);
}
'Algorithm' 카테고리의 다른 글
[알고리즘] Backtracking(백트래킹) (0) | 2018.02.23 |
---|---|
[백준 알고리즘][완전탐색] 3085번 사탕 게임 (0) | 2018.02.12 |
[백준 알고리즘][완전탐색] 2309번 일곱 난쟁이 (0) | 2018.02.12 |
[백준 알고리즘] 2667번 단지번호붙이기 (0) | 2018.01.18 |
[백준 알고리즘] 1743번 음식물 피하기 (0) | 2018.01.18 |