Study/Baekjoon

Baekjoon1065: 한수

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

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

 

추상화
1) N은 자연수이다
2) 각 자리 수의 숫자를 얻어내야 한다
3) 각 자리 수가 등차수열을 이뤄야한다
제한조건과 확장성 판별
욕심이 들었다. 1000이 아니라 훨씬 큰 숫자들의 한수를 구할 수 있을까?
제한조건은 다음과 같았다
1) 숫자가 커지면 자리 수가 커진다. 각 자리를 구하기 위한 연산을 계속할 수 있는가?
2) 등차수열 판별을 하기위한 각 자리끼리의 연산도 많아진다
위 제한조건에 따라 확장성은 좋지 않을 것으로 보았고
1자리 수일 때 2자리 수 일 때, 3자리 수일 때, 4자리 수일 때를 각각 나누어 판별했다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           int N = Integer.parseInt(br.readLine());
           if(N<100) {
        	   System.out.println(N);
//2 자리수 이하: 2자리 이하인 수는 등차수열의 연산을 할 필요가 없다
           } else if(N>=100 && N<1000) {
        	   int sum = 99;
//N이 세자리인 경우 최소 99개의 한수를 가진다
        	  for(int i = 100; i<N+1;i++) {
        		int a = i/100;
        		int b = (i%100)/10;
        		int c = i%10;
//a: 100의 자리, b: 10의 자리, c: 1의 자리
        		if( a-b == b-c) {
        			sum++;
//조건이 충족하면 sum값에 1을 더한다
        		}
        	  }
        	  System.out.println(sum);
           } else if( N == 1000) {
        	   System.out.println(144);
//이 부분은 굳이 쓰지 않아도 된다
//세자리 수 판별문에 1000을 넣으면 a=10이 나오기 때문이다
           }
	}
}

 

맨 아래 조건문을 위 조건문에 넣으면 결과창은 다음과 같다 ( N<=1000)

'Study > Baekjoon' 카테고리의 다른 글

Baekjoon2941*: 크로아티아 알파벳  (0) 2021.10.11
Baekjoon5622: 다이얼  (0) 2021.10.11
Baekjoon2908: 상수  (0) 2021.10.10
Baekjoon1157: 단어 공부  (0) 2021.10.10
Baekjoon4673: 셀프 넘버, 논리 배열과 StringBuilder의 사용  (0) 2021.10.08