[문제]
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
[입력]
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
[출력]
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
[예제 입력]
110
[예제 출력]
99
[예제 입력]
1
[예제 출력]
1
[예제 입력]
210
[예제 출력]
105
우선 이 문제는 "한수" 에 대해 이해를 해야한다.
123 에서 각 자리를 떼어봤을 때 "1" "2" "3" 이 되는데,
연속된 두 개의 수의 차이가 일정한 수열을 등차수열이라고 하고,
각 자리가 등차수열을 이루면 그 수를 한수 라고 한다.
123 의 경우 2-1의 차이도 1, 3-2의 차이도 1이므로 한수이다.
반면,
예로 101의 경우
첫번째와 두번째 자리인 1과 0의 경우 -1 이지만,
두번째 자리와 세번째 자리인 0 과 1의 경우 +1 이므로, 한수가 아니다!
또한, 1부터 99까지의 모든 수는 한수이다!
1 ~ 9 : 수열의 길이가 1인 등차수열
10 ~ 99 : 수열의 길이가 2인 등차수열
+) 두 자리로 이뤄진 수들이 모두 등차수열인 이유?
등차수열은 연속된 두 수 사이의 차이가 일정한 것이다.
예로 14라는 숫자는 공차가 3인 등차수열이다. 두 자리수의 숫자들은 모두 "1개" 의 공차를 갖고있는데,
이를 등차수열로 보는 것이다.
한 자리수도 마찬가지로 1로 예를 들면, 1은 공차가 0인 등차수열이다.
따라서, 이 문제에서 굳이 1부터 N까지 전부 구할 필요 없이,
입력 받은 숫자 N이 100보다 작은지 큰지에 따라 달리 처리를 해주면 된다.
작은 경우엔 답이 N이 되고,
큰 경우엔 100부터 N까지 한수인 지 검사를 해주면 된다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int num = 0;
// 100보다 작은 경우
// 1~99는 한수
if (N < 100) {
num += N;
}
else {
num += 99;
for (int i = 100; i <= N; i++) {
int n = i;
int[] arr = new int[3];
arr[0] = n / 100;
n %= 100;
arr[1] = n / 10;
arr[2] = n % 10;
if (arr[1] - arr[0] == arr[2] - arr[1]) {
num++;
}
}
}
System.out.println(num);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 / 11726번 / 2×n 타일링 (0) | 2023.01.15 |
---|---|
백준 / 1158번 / 요세푸스 문제 (0) | 2023.01.09 |
백준 / 13549번 / 숨바꼭질 3 (0) | 2023.01.07 |
백준 / 2712번 / 미국 스타일 (0) | 2023.01.06 |
백준 / 1931번 / 회의실 배정 (0) | 2023.01.06 |