PS (C, C++)

[백준/C] 함수

최연재 2022. 8. 20. 02:00

15596 정수 N개의 합

#include <stdio.h>
long long sum(int* a, int n)
{
	long long result = 0;
	for (int i = 0; i < n; i++) result += a[i];
	return result;
}

함수를 작성하면 된다.

4673 셀프 넘버

#include <stdio.h>

int d(int n)
{
	int result = n;
	while (n > 0)
	{
		result += n % 10;
		n /= 10;
	}
	return result;
}

int main()
{
	int a[10001];
	for (int i = 1; i <= 10000; i++)if (d(i) <= 10000) a[d(i)] = 0;
	for (int i = 1; i <= 10000; i++) if (a[i] != 1) printf("%d \n", i);
	return 0;
}

양의 정수이므로 반복문을 1부터 시작했다. 

생성자가 없는 숫자를 출력하면 되므로 1부터 10000까지의 수의 d(n)을 구한다. 그러면 n이 d(n)이 생성자라는 뜻이므로 a[d(i)]의 값을 가진 인덱스는 셀프 넘버가 아니다. 그래서 반복문을 돌면서 셀프 넘버가 아닌 인덱스에 0을 저장한다. 

 

마지막으로 반복문을 돌면서 인덱스에 저장된 값이 0이 아닌 경우에만 인덱스를 출력한다. 

배열에서 인덱스에 저장된 값에 셀프넘버인지 아닌지를 저장한 것이다. (인덱스에 저장된 값이 0이면 그 인덱스의 숫자는 생성자가 있다는 뜻이고 그렇기 때문에 셀프넘버가 아니다.)

 

처음에는 다른 방식(역방향)으로 하려고 했는데, 아무리 봐도 아닌 것 같아서 방향을 틀어서 아예 새로운 코드를 작성했다. 

1065 한수

#include <stdio.h>

int countNumber(int n)
{
    int result;
    if (n <= 99) result = n;
	else
	{
		result = 99;
		for (int i = 100; i <= n; i++)
		{
			int a = i / 100;
			int b = (i % 100) / 10;
			int c = i % 10;
			if ((a - b) == (b - c)) result++;
		}
	}
    return result;
}

int main()
{
	int n, result, k=0;
	scanf("%d", &n);
	printf("%d", countNumber(n));
	return 0;
}

수가 100보다 작은 경우에는 무조건 등차수열이 성립한다. 공차가 음수부터 0, 양수 모두 가능하기 때문에 수가 100보다 작은 경우에는 입력값이 한수의 개수가 된다. 

 

99보다 큰 경우에는 각 자릿수를 비교해야 한다. 먼저 99까지는 무조건 한수이므로 결과를 99로 한 상태에서 반복문을 돈다. 입력이 1000보다 작은 수인데, 1000은 한수가 아니므로 굳이 신경쓰지 않고 코드를 짰다. 일의 자리, 십의 자리, 백의 자리를 각각 구하고 (백의 자리 수 - 십의 자리 수)와 (십의 자리 수 - 일의 자리 수)를 비교한다. 같으면 등차수열이 성립하는 것이므로 결과에 1을 더한다. 

 

결과를 반환해서 출력한다. 

'PS (C, C++)' 카테고리의 다른 글

[백준/C] 1924 2007년  (0) 2022.08.20
[백준/C] 문자열  (0) 2022.08.20
[백준/C] 1차원 배열  (0) 2022.08.20
[백준/C] 반복문  (0) 2022.08.20
[백준/C] 조건문  (0) 2022.08.20