이번 문제는 한수를 찾는 문제였습니다. 문제의 설명대로 한수는 각 자리가 등차수열 이루는 수이고 등차수열은 연속된 두개의 수가 일정한 수열을 말합니다. 예를 들어 753 같은 경우 각 자리를 7, 5, 3으로 보고 -2씩 일정하게 감소하고 있습니다. 그리고 여기서 -2를 공차라고 합니다. 다른 예로는 222이 있는데 이 경우는 공차가 0입니다. 이러한 수를 한수라 하고 이 한수의 개수를 찾는 문제입니다. 여기서 1~9까지는 기본적으로 비교할 숫자가 없으므로 한수로 보는듯 합니다. 거기에 더해 10~99까지도 공차는 존재하지만 비교할 대상이 없으므로 한수로 치는거 같습니다.(문제에서 110을 입력했는데 99가 나온걸로 보아 1~99까지를 한수로 친거 같습니다.) 이 전재를 기본으로 깔고 문제를 풀어보았습니다.
import java.util.Scanner;
public class Hansu_1065 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int num = sc.nextInt(); //숫자 N입력
int count = 0; //한수 개수 카운팅
for (int i = 1; i <= num; i++) { //입력 범위가 1이상이므로 1부터 시작.
if (i <= 99) { //1~99까지는 모두 한수이므로 무조건 +1
count += 1;
} else if (i <= 999) { //100부터는 조건을 확인해서 한수 조건을 충족하면 +1
String[] num_str = Integer.toString(i).split(""); //각 자리수를 자정할 문자열 배열 생성.
if ((Integer.parseInt(num_str[1]) - Integer.parseInt(num_str[0])) == (Integer.parseInt(num_str[2])- Integer.parseInt(num_str[1]))) { //백의자리 십의자리 일의자리를 각각 a, b, c라고 생각하고 b-a == c-b 이면 한수이므로 +1
count += 1;
}
}
}
System.out.println(count);
}
}
한수를 찾기 위해 1~99까지는 무조건 한수이므로 카운팅을 해줬고 100부터는 한수 조건을 만들어서 만족하면 +1을 해줬습니다. 여기서 숫자를 각 자리수로 나누기 위해서 나누기 대신 문자열로 변경하는 toString을 통해 숫자를 문자열로 바꾸고 String의 split을 통해 각 자리수의 숫자를 num_str배열에 저장하였습니다. 여기서 각 배열에 저장된 값은 문자이기에 숫자에서의 +- 연산이 불가능하기에 Integer.parseInt()메소드를 사용해서 숫자형으로 바꿔주었습니다.
그리고 한수의 조건을 다시 보면 975을 보면 7(십의 자리 수) - 9(백의 자리 수) == 5(일의 자리 수) - 7(십의 자리 수) 이런식으로 차이가 -2로 일정한 걸 알 수 있습니다.
이 식을 이용해서 배열의 두번째 자리인(십의 자리 수) num_str[1]에서 배열의 첫번재 자리인(백의 자리 수)num_str[0]을 뺀 값과 num_str[2](일의 자리 수) - num_str[1](십의 자리 수)의 값이 같으면 한수이므로 +1 카운팅을 해주었습니다.
출처 : 백준 1065번 https://www.acmicpc.net/problem/1065