BOJ 1065

2020-01-25

위 문제는 백준 사이트의 알고리즘 1065번 문제에 관한 설명입니다.


문제

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.

N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		int answer = 0;
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		answer = checkHanNumber(N);
		System.out.println(answer);
		sc.close();
	}

	private static int checkHanNumber(int n) {
		int check = 99;
		int Num = n;
		int array[] = new int[3];
		if (0 < Num && Num < 100)
			check = Num;
		else {
			for (int i = 100; i <= n; i++) {
				array[0] = i % 10;
				array[1] = (i / 10) % 10;
				array[2] = (i / 100) % 10;
				if(i==1000)
					break;
				if ((array[2] - array[1]) == (array[1] - array[0]))
					check++;
			}
		}
		return check;
	}
}

일단 제가 푼 소스코드입니다.

예제 5개중에 3개만 넣고 제출을 했더니 실패가 나왔었습니다.

마지막 1000을 고려하지 못했던 것 때문이었습니다.

단순히 array[]를 1 10 100의 자리를 넣다보니 1000일때 한수로 여겨져서 기대값보다 1이 더 높게 나와서 실패한 점이었습니다.

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt(), i, k, han=0, a[] = new int[3];
		for (i = 1; i <= n; i++) {
			if (0 < i && i < 100) han = i;
			else if (i == 1000) break;
			else {
				k = 0; int t = i;
				while (t > 0) {
					a[k] = t % 10;
					t /= 10; k++;
				}
				if (a[0] - a[1] == a[1] - a[2]) han++;
			}
		}
		System.out.println(han);
		sc.close();
	}
}

[출처] [백준] 1065 - 한수|작성자 occidere

다른 분이 푼 소스코드이다. 해당 문제는 함수단계의 문제였으므로 함수를 활용했으나 저분은 그렇지 않다.

문제에서 함수를 사용하라는 조건은 없었으니 상관은 없지만 저분이 푼 것이 소스코드가 조금 더 깔끔해보인다.

쉬운 문제였지만 최대한 간결하게 코드를 짤 수 있도록 고려해야겠다는 생각이 다시 한번 들었다.

한수