티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 1065번 한수

https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

* 사용언어 : java, 자바

 

1. 문제

어떤 양의 정수 X의 각 자리수가 등차수열을 이루면 그 수를 한수라고 함

입력 N에 대해서 1보다 크거나 같고 N보다 작거나 같은 한수의 개수를 출력

(1 ≤ N ≤ 1000)

 

2. 풀이

우선 한수에 대해 생각해보겠습니다.

한수가 되려면, 각 자리수가 등차수열을 이뤄야 합니다.

 

예를 들어 147이라는 수를 생각해보면,

1, 4, 7 세 숫자가 공차가 3인 등차수열이 되므로 147은 한수가 됩니다.

그 밖에 123, 246, 852 ... 과 같은 숫자들도 한수겠죠.

 

그렇다면 1자리 이거나 2자리 숫자는 어떻게 봐야 할까요?

문제의 입, 출력 예시로 생각해보았습니다.

 

문제의 입력 예시는 110이고 출력 예시는 99입니다.

여기서 100 부터 110 까지 숫자 중에 한수는 없습니다.

즉, 1부터 99까지를 모두 한수로 본 것입니다.

 

그런 이유로 저는 한수를 확인하는 함수(checkHanNumber(int number)를 만들 때,

함수의 매개변수는 모두 3자리 숫자라고 가정하고 쉽게 코딩했습니다.

 

모든 자리수에 대해 가능하도록 일반화하여 코딩할 수도 있겠지만,

불필요한 노력이라 생각하여 이 문제에 맞게 최대한 간단하게 풀었습니다.

 

풀이에 비해 코드는 간단하니 코드 설명은 생략하겠습니다.

 

3. 코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		
		if (n < 100) {
			System.out.println(n);
		} else {
			int result = 99;

			for (int i = 100; i <= n; ++i) {
				result += checkHanNumber(i);
			}

			if (n == 1000) result--;
			System.out.println(result);
		}
	}
	
	private static int checkHanNumber(int number) {
		int num1 = number / 100 % 10;
		int num2 = number / 10 % 10;
		int num3 = number % 10;
		
		if (num2 * 2 == num1 + num3) return 1;
		return 0;
	}
}

* 한수가 아닌 1000에 대해 checkHanNumber(1000) 의 결과가 1이므로 result에서 1을 줄여주었습니다.

728x90
반응형
댓글