문제
- 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
- 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
- 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
입출력 예제
등차수열 및 한수 이해하기 ( 아는 사람은 Pass )
- 등차수열에 대한 이해 : 수열을 등차수열이라고 한다. 처럼 연속한 두 항의 차가 일정한
- 한수 : 어떤 숫자에 대해서 각 자리수들이 등차수열을 이루는 수.
- 공차(common difference) 또는 d : 연속한 두 항에서, 뒤 항에서 앞 항을 뺀 값 => 1,3,5,7,9... 에서 두번째 항 - 첫번째항 (3-1 = 2) 은 2(공차d)가 된다.
- 등차수열의 식 : a(n번째) = a + ( n − 1 ) * d
- 579를 식에 대입 : 9 = 5 + ( 3 − 1 ) * 2
설명
- 1부터 1000사이의 숫자가 들어오는데 여기서 잠시 생각해 보면 1에서 99 까지는 모두 한수이다. ( 공차가 하나거나 없기 때문에... ) 입력받은 숫자가 100미만이면 그대로 입력한다.
- 1000 또한 딱 봐도 한수가 아니다. 그렇다면 우리는 세자리의 숫자만 확인하면 된다. ( 100~999까지 )
- 등차수열의 식을 이용해서 가장 마지막에 있는 숫자가 식으로 동일하게 나온다면 한수라고 보면된다. ( 단, 숫자가 3자리 이기 때문에 가능함. )
- 이제 입력받은 숫자 n까지 반복적으로 한수가 맞는지 검사하고 true로 나온 한수의 개수를 출력하면 된다.
임이의 수 579가 한수인지 등차수열의 식으로 확인해 보자. ( 문제 에서는 주어진 숫자까지 반복해서 검증하면 된다. )
a (초항) : 5
d (공차) : 2
등차수열의 식 : a(n번째) = a + ( n − 1 ) * d
실제 대입 : 9 = 5 + ( 3 − 1 ) * 2
식을 대입 했을 때 true가 나오면 한수로 보면 된다.
579는 한수가 맞다.
사실 코드로 보는게 백배 더 쉽다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// 1065번 - 한수
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.valueOf(br.readLine());
n = n == 1000 ? 999 : n; // 1000은 한수가 아니기 때문에 999로 넣어준다. ( isHanNumber는 세자리만 체크하기 떄문에... )
int result = n > 99 ? 99 : n; // result 는 최종 결과인데 n이 99보다 큰 경우 99까지는 한수이기 때문에 99를 넣어준다. 99이하 라면 n을 그대로 대입한다.
for (int i = 100; i <= n; ++i) {
if(isHanNumber(i)) result++;
}
System.out.println(result);
}
public static boolean isHanNumber(int checkNum) {
int a_1 = checkNum / 100;
int a_2 = checkNum / 10 % 10;
int a_3 = checkNum % 10;
// a(n번째) = a + (n−1) * d
return a_3 == a_1 + (3-1) * (a_3 - a_2) ;
}
}
|
cs |
'Algorithm > Baekjoon' 카테고리의 다른 글
백준(11720번) - 숫자의 합 (0) | 2021.07.18 |
---|---|
백준(11654번) - 아스키 코드 (0) | 2021.07.18 |
백준(4673번) - 셀프넘버 (0) | 2021.07.15 |
백준(15596번) - 정수 N개의 합 (0) | 2021.07.14 |
백준(4344번) - 평균은 넘겠지 (0) | 2021.07.13 |