백준(java) - 6-3(한수) 풀이
문제
- 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
- 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
- 첫째 줄에 1보다 크거나 같고, 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 count = 0;
String arr[] = new String[N];
for (int i = 0; i < N; i++) {
// arr[i]에 값을 저장한다.
arr[i] = Integer.toString(i + 1);
// 잘 담겼는지 확인을 위해 출력
// System.out.println(arr[i]);
if(arr[i].length() == 1){
count++;
continue;
}
// arr[i]의 자릿수 길이 만큼의 길이를 가진 c[]를 선언 (c[]의 각 자리에 각 숫자를 담아 비교하기 위해)
int c[] = new int[arr[i].length()];
int differance = 0;
int lastDifferance = 0;
int result = 0;
for(int j = 0; j < arr[i].length(); j++){
// c[j]에 arr[i]의 각 자릿수 숫자를 담는다.
c[j] = arr[i].charAt(j) - '0';
// c[]의 모든 숫자들을 꺼내서 각 숫자들의 차이를 비교하고 그 비교가 모두 같으면
// count++를 실행해 한수의 총 갯수를 1 늘린다(10 미만의 수들을 if,continue를 통해 하이패스로
// count++를 실행한다.
for(int k = 1; k < c.length; k++){
// 첫번째 숫자와 두번째 숫자의 차이를 기본 differance로 저장하고 후에 나오는 차이는
// lastDifferance로 저장해서 두 값이 같은지 비교한다.
// lastDifferance는 계속 갱신되어야 한다.
if(k == 1){
differance = c[k] - c[k - 1];
lastDifferance = differance;
} else {
lastDifferance = c[k] - c[k - 1];
}
if(lastDifferance == differance){
result = -1;
} else {
result = 0;
}
}
// 한수임을 확인하는 코드에서 한수임이 확인 됐다면 result를 -1로 값을 변경한다.
// 만약 한수가 아니라면 result를 0으로 변환시킨다.
}
if(result == -1){
count++;
}
}
System.out.println(count);
}
}
후기
- 여태까지 풀었던 백준 문제 중 가장 어려웠다. 이렇게 푸는게 맞는지는 모르겠지만, 3중 for문 안에 여러 개의 조건문을 넣어 생각에 생각을 거듭하며 풀었고 코드가 복잡해지다보니 주석을 달지 않고는 내 코드를 알아 볼 수가 없었다. 처음으로 주석을 필요에 의해서 달게 되었고, 또한 주석의 중요성도 뼈저리게 깨달았다.