백준(C언어)/23년 1월
브루트 포스 - 2231번
C0MPAS
2023. 1. 11. 14:00
1월 11일(수) - 브루트 포스(2231번)
2231번: 분해합
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
1. 생성자가 주어진 경우 분해합결과를 계산하는 식을 정리한 이후,
거꾸로 분해합결과가 주어지면 생성자를 되찾으려고 했으나 실패했다
-> 브루트 포스 알고리즘의 카테고리 안에 있는 문제이기도 하고, 최소의 생성자를 출력해야하기 때문에,
그냥 int i 값을 1부터 하나씩 증가시켜가며 분해합을 진행하다가, 입력된 n 값과 동일하게 나오는 경우가 있는지를 탐색했다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
int divide_hap(int n)
{
int mid_result = n;
while (n > 0)
{
mid_result = mid_result + (n %10);
n = n / 10;
}
return mid_result;
}
int main(void)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
if (divide_hap(i) == n)
{
printf("%d\n", i);
break;
}
if (i == n)
{
printf("%d", 0);
}
}
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ