문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다.
등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
| 예제 입력 | 예제 출력 |
| 110 | 99 |
| 1 | 1 |
| 210 | 105 |
| 1000 | 144 |
| 500 | 119 |
⭕ 풀이
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int result = Integer.parseInt(br.readLine());
br.close();
System.out.print(hansoo(result));
}
public static int hansoo(int num){
int cnt = 0;
int A,B,C;
if(99<num){
for(int i=100;i<=num;i++){
A=i/100;
B=(i/10)%10;
C=i%10;
if(A-B==B-C){
cnt++;
}
}
cnt += 99;
}
else{
cnt = num;
}
return cnt;
}
}
✅ 등차수열
연속하는 두 항의 차이가 모두 일정한 수열
수열의 첫항을 초항이라고하며,
1,2,3,4,5 라는 수열이있다면
초항은 1이되고 공통적으로 같은 차이 공차는 1이된다.
2,5,8 인 수열에서는 초항은 2 공차는 3이다
이제 문제를 이해해보자.
만약 입력받은 수가 99보다 큰경우 100이상 즉, 세자리이상인 수.
100의자리 10의자리 1의자리를 각각 A,B,C로 받고
첫번째자릿수-두번째자릿수가 두번째자릿수-세번째자릿수와 같을경우 cnt++ 을 실행한다.
여기서 for문이 끝나면 증가시킨 cnt에 99 를더한다.
왜 99 를 더할까?
만약 입력받은 수가 99이하인경우 1~99까지는 모든 수를 등차수열로 볼 수 있다.
한자릿수는 그자체로 수열이며
1 0은 공차가 -1인 등차수열 4 9 는 공차가 5인 등차수열 9 9 는 공차가 0 인 등차수열.
그러므로 입력받은수가 100이상인경우에는 99까지는 모두 등차수열이므로 99를 더한다.
99이하일경우에는 입력받은 수를 그대로 cnt가 받아서 return하도록 작성했다.
❌
a=i%10;
i/=10;
b=i%10;
i/=10;
c=i%10;
이렇게 i%10 으로 1의자릿수를 받고 i /=10으로 나누고
다시 i%10 을 하며 작성했는데 자꾸 시간초과가 나길래
풀이의 코드로 바꾸어봤더니 맞았다.
i/=10 가 반복되며 시간이 많이 소모되었던것같다.
-출처
https://www.acmicpc.net/problem/1065
'Algorithm > Baekjoon(Java)' 카테고리의 다른 글
| [백준/JAVA] 11720 : 숫자의 합 ( char - '0', 48 ) (0) | 2022.07.23 |
|---|---|
| [백준/JAVA] 11654 : 아스키 코드 (0) | 2022.07.22 |
| [백준/JAVA] 4673 : 셀프 넘버 (0) | 2022.07.20 |
| [백준/JAVA] 15596 : 정수 N개의 합 (0) | 2022.07.20 |
| [백준/JAVA] 4344 : 평균은 넘겠지 (0) | 2022.07.19 |