시간복잡도 3651
https://www.acmicpc.net/problem/1065
문제를 읽고 이해가 안되서 검색해서 이해하였다.
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 의미는 예를 들어
X 가 1 이라면 한수이다. 한자리 숫자는 길이가 1인 등차수열이라고 한다. 1~9 까지 다 그렇다
X 가 12 이라면 한수이다. 길이가 2이고 공차가 1인 등차수열이다
X 가 24 이라면 한수이다. 길이가 2이고 공차가 2인 등차수열이다. 두자리 숫자도 그냥 다 등차 수열이다
X 가 246 이면 한수이다. 길이가 3이고 공차가 2인 등차수열이다.
X 가 253 이면 한수가 아니다. 2와5는 3의 차이가 5와3은 -2의 차이가 나므로 등차수열이 아니다
배열을 1001 개 선언해서 1부터 1000 까지 한수의 개수를 계산해서 저장하였다
배열 1~99 는 그냥 for문 돌리면서 1~99 저장하면 된다
100 부터는 한수인지 아닌지 판단하는 로직에 따라
한수인가? 1) 맞으면 이전배열에 저장해놨던 값에 + 1 저장
2) 아니면 이전배열값을 현재배열에 저장
한수 인지 판단하는 로직은 숫자의 각 자릿수를 배열에 하나씩 따로 저장하고 for문 돌리면서 숫자간의 차이를 구하고 비교하는 방식으로 하였다
import java.io.*;
public class Main {
static int[] hansuArr = new int[1001];
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] tempArr = new int[4];
for(int i = 1; i < hansuArr.length; ++i)//100~ 1000 약 4500 = 900 * 5
{
if(i < 100)
hansuArr[i] = i;
else
{
int copy = i;
int j = 0;
while(copy != 0)
{
tempArr[j++] = copy % 10;
copy/=10;
}
int diff = 0;
int diff2 = 0;
boolean isHansu = true;
for(int k = 0; k+1 < j;++k)
{
diff2 = tempArr[k] - tempArr[k+1];
if(k == 0)
{
diff = diff2;
}
else if(diff == diff2)
{
diff = diff2;
}
else
{
isHansu = false;
break;
}
}
if(isHansu)
hansuArr[i] = hansuArr[i-1] + 1;
else
hansuArr[i] = hansuArr[i-1];
}
}
int N = Integer.parseInt(br.readLine());
System.out.println(hansuArr[N]);
}
}