출처 : https://www.acmicpc.net/status?user_id=sharkkk&problem_id=1065&from_mine=1
처음에 1000이하인줄 모르고, 일반화시켜서 풀다가 , 각각의 자릿수 분리 후 -> 배열 저장 -> 공차가 다른게 나오는 순간 return false해주기로 풀었다.
1,000,000이라도, 각 자릿수를 나누는건 연산횟수가 10회 미만이므로, 10의 10승까지는 int가 못나타내니까, 아무리 커봤자 Int 범위내에서는 2억번 안쪽으로 나올거 같아서 자릿수를 기준으로 풀어버렸다.
항상 조건을 잘보도록하자. 쉽게 풀 수 있는 문제를 어렵게 푸는 것도 손해이다.(3자리 수이면 말이 달라지지)
첫번째 풀이(자릿수를 분리)
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int split_Number(int arr[], int N)
{
int cnt = 0;
while (N > 0)
{
arr[cnt] = N % 10;
N /= 10;
cnt++;
}
return cnt;
}
bool check_Hansu(int arr[], int len)
{
int gap = arr[1] - arr[0];
for (int i = 1; i < len; i++)
{
if (gap != arr[i] - arr[i - 1])
{
return false;
}
}
return true;
}
int main()
{
fastio;
int N, L, M, R;
int ans = 0;
int len;
cin >> N;
if (N < 100)
{
cout << N;
return 0;
}
for (int i = 100; i <= N; i++)
{
int arr[10] = {};
len = split_Number(arr, i);
if (check_Hansu(arr, len))
ans++;
}
cout << 99 + ans << '\n';
return 0;
}
두번째 풀이 (문제의 조건에 맞게)
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int main()
{
fastio;
int N, L, M, R;
int ans = 0;
cin >> N;
if (N < 100)
{
cout << N;
return 0;
}
for (int i = 100; i <= N; i++)
{
L = i / 100;
M = i / 10 % 10;
R = i % 10;
if (R + L == 2 * M)
ans++;
}
cout << 99 + ans << '\n';
return 0;
}