백준 15596
내코드
long long sum(int *a, int n) {
long long ans = 0;
for (int i = 0; i < n; i++) {
ans += a[i];
}
return ans;
}
백준 4673
내코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int d(int a) {
int ret = a;
while (a != 0) {
ret += a % 10;
a = a / 10;
}
return ret;
}
int main() {
int arr[10000] = { 0, };
int dnum[10000];
for (int i = 0; i < 10000; i++) {
dnum[i] = d(i + 1);
if (dnum[i] <= 10000) {
arr[dnum[i] - 1]++;
}
}
for (int i = 0; i < 10000; i++) {
if (arr[i] == 0) {
printf("%d\n", i + 1);
}
}
return 0;
}
먼저 a과 a의 각 자리 수를 더하는 함수인 d(a)을 작성했다. 주어진 a에 대해 10으로 나눈 나머지 값을 저장하고 10으로 나누는 것을 a가 0이 되기 전까지 반복하여 결과를 return하는 함수이다. 그래서 1부터 10000까지 d(a)를 적용시킨 함수 값을 얻고 이를 dnum 배열에 저장한다. dnum배열에 저장된 수들은 d(a)를 적용시킨 값이므로 모두 생성자를 가진다. 만약 dnum 배열에 저장된 수가 10000이하라면 arr배열을 통해 그 수는 생성자가 있다는 표시를 하기 위해 1증가시킨다. 그 후 arr배열의 값이 0인 인덱스+1의 수만 출력하면 생성자가 없는 셀프넘버만 출력된다.
백준 1065
내코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int han(int a) {
int cnt = 0;
int copy = a;
int x, y, z;
while (copy != 0) {
copy /= 10;
cnt++;
}
switch (cnt) {
case 1:
return 1;
case 2:
return 1;
case 3:
x = a % 10;
a /= 10;
y = a % 10;
a /= 10;
z = a % 100;
if (2 * y == x + z) {
return 1;
}
else
break;
}
return 0;
// 0: false 1: true
}
int main() {
int n;
int cnt = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
if (han(i + 1) == 1) {
cnt++;
}
}
printf("%d", cnt);
return 0;
}
이 문제는 일단 문제 자체가 잘 이해가지가 않았다. 그래서 처음엔 아래와 같은 코드를 작성했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int han(int a) {
int x, y, z;
x = a % 10;
a /= 10;
y = a % 10;
a /= 10;
z = a % 100;
if (2 * x == y + z || 2 * y == x + z || 2 * z == x + y) {
return 1;
}
return 0;
// 0: false 1: true
}
int main() {
int n;
int cnt = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
if (han(i + 1) == 1) {
cnt++;
}
}
printf("%d", cnt);
return 0;
}
당연히 틀렸다. 그래서 한수에 대해 구글링해보니 나처럼 이 문제에 대해 이해를 잘 못한 사람이 질문을 올려놓은 글을 봤다.
https://www.acmicpc.net/board/view/25689
글 읽기 - 문제 이해가 안됩니다
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
이 글을 보니 한 자리수 숫자는 그 자체로 길이가 1인 등차수열이고, 두자리 수 숫자는 각 자리 수가 어떤 수가 되든 길이가 2인 등차수열이라는 것이다. 두자리 수 숫자가 길이가 2인 등차수열은 이해가 갔지만 한 자리 수 숫자가 그 자체로 길이가 1인 등차수열이라는게 이해가 안됐다. 그래도 위의 성질을 이용해서 1자리나 2자리수의 숫자는 1을 return하고, 3자리수의 경우 각 자리가 등차수열일 경우만 1을 return하는 함수를 작성해 문제를 해결했다.