공부하는 블로그

Baekjoon | Q.1065 - 한수 본문

알고리즘 공부

Baekjoon | Q.1065 - 한수

치킨닮은닭 2019. 12. 22. 23:33
 

1065번: 한수

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

www.acmicpc.net

 정수 X의 자리수가 등차수열을 이루는 수를 한수라고 한다. 주어진 정수 N에 대해서 1보다 크거나 같고 N보다 작거나 같은 한수의 개수를 출력하는 문제이다.

 

import java.util.Scanner;

public class Main {
	
	// 한수인지 아닌지 판별하는 함수
	static boolean hansu(int n) {
		String num = n + "";
		int len = num.length();
        
		// 한자리 수일 경우 (한수가 맞음)
		if(len == 1) {	
			return true;
		}
		
		int[] numArr = new int[len];	// 각각의 자리수를 저장해둘 배열
		int[] diff = new int[len - 1];	// 자리수간의 차이를 저장해둘 배열
		boolean result = true;	// 한수인지 아닌지 리턴해줄 변수
		
		// 각각의 자리수를 charAt을 이용하여 배열에 저장
		for (int i = 0; i < len; i++) {
			numArr[i] = Integer.parseInt(num.charAt(i) + "");
		}
		
		// 자리수간 차이를 배열에 저장
		for (int i = len - 1; i > 0; i--) {
			diff[i-1] = numArr[i] - numArr[i-1];
		}
		
		// 자리수간의 차이가 하나밖에 없을 경우(두 자리수인 경우)
		if(diff.length == 1) {
			return true;
		}
		
		// 차이를 하나하나 비교하여 등차수열인지 판별
		for (int i = 0; i < diff.length - 1; i++) {
			if(diff[i] != diff[i+1]) {	// 하나라도 차이가 다르다면
				result = false;	// 한수가 아님
				break;		// 반복문을 빠져나옴
			};
		}
		
		return result;
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		
		int count = 0;
		
		for (int i = 1; i <= n; i++) {
			if(hansu(i)) count++;
		}
		
		System.out.println(count);
	}

}

 

 한수인지 아닌지 구분하는 함수를 만들었다. n이 한 자리수이거나 두 수의 차이가 하나만 나올 경우(n이 두 자리수) 무조건 true를 반환하도록 하였다. 그 이외에는 자릿수간의 차이를 배열에 저장하여 반복문을 이용하여 차례차례 비교해주었다. 하나라도 같지 않을 경우 false를 반환하도록 하였다.

 

Comments