문제 URL:
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
다음 문제는 한수를 구하는 문제로
한수란, 어떤 양의 정수 X의 각 자리가 등차수열을 이루는 수이다.
등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.
여기서 한 자리 수는 그 자체로 한수가 되며,
두 자리 수 역시 모두 한수인데,
이는 두 자리 수의 각 자리의 차이가 일정하여 항상 등차수열을 이루기 때문이다.
따라서 1부터 99까지의 수는 항상 한수이다.
세 자리 수는 한수가 될 수 있는 조건이 정해져 있는데,
1) 백의 자리와 일의 자리를 더해서 2로 나눈 수가 십의 자리와 같거나,
2) 백의 자리와 일의 자리가 같은 경우에만 한수가 될 수 있다.
이렇게 다음 조건들에 맞추어 코드를 짜면 아래와 같이 나온다.
또한, 결과적으로 출력값은 한수의 총 개수이기 때문에, 각 자리 수마다 구한 한수의 개수를 더해주어 출력했다.
(세 자리 수일 때는 위에서 말한 두 가지 경우를 if 조건문의 조건으로 작성해주고, 조건문 안에 변수 count를 넣어 한수의 개수를 세어준 뒤, count와 두자리 수까지 구한 한수의 개수(99)를 더해주는 방식으로 한수의 개수를 구하였다.)
#include <iostream>
using namespace std;
int main()
{
int N, count = 0;
int n_100, n_100r, n_10, n_10r;
cin >> N;
if(N>=1 && N<100)
count = N;
else if(N <= 1000)
{
for(int n=100; n<=N; n++)
{
n_100 = n/100;
n_100r = n%100;
n_10 = n_100r/10;
n_10r = n_100r%10;
if(((n_100+n_10r)/2 == n_10) && ((n_100+n_10r)%2 == 0))
count++;
}
count = count + 99;
}
cout << count;
return 0;
}
2021.1.18
다음 문제를 함수를 사용하여 더 효율적으로 작성해보았다.
digitNum함수를 사용하여 각 자리의 숫자를 동적 배열에 넣어주고 만들어진 배열을 반환해주었다.
main함수에서는 배열에 들어간 각 값을 이용하여 한수를 찾아 결과를 출력하였다.
#include<iostream>
using namespace std;
int* digitNum(int n)
{
int* list = new int[4];
int i = 0, x;
while(n!=0)
{
x = n%10;
n = n/10;
list[i] = x;
i++;
}
return list;
}
int main()
{
int count = 99, num;
cin >> num;
if(num>99)
{
for(int i=100; i<=num; i++)
{
int* array = digitNum(i);
if(array[1]!=0 && (array[1]==(array[0]+array[2])/2.0))
count++;
}
cout << count;
}
else
cout << num;
return 0;
}