백준 1065번 한수 - 자바

728x90

www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net


이 문제는 n개의 수가 주어졌을 때 그 수 까지의 한수가 몇 개 인지 출력하는 알고리즘 이다.

 

한수와 수학의 등차수열에 관련해 이해하면 풀기 쉬운 알고리즘이다.

 

등차수열은 123 처럼 백이십삼 이 아닌 숫자 1, 2 ,3 으로 보면 편하다.

 

123라는 수는 1씩 증가하는 등차수열이다.

 

124는 첫째 자리 '1' 과 두번째 자리 '2' 는 1씩 증가하나 두번째 자리 '2'와 세번째 자리 '4' 는 2가 차이나므로 한수가 아니다.

 

1-9 는 길이가 1인 등차수열 이므로 모두 한수이고, 10-99 까지도 길이가 2인 등차수열이다. 10-99 인 경우는 양수, 음수의 공차가 나온다. 

 

그러니 99까지는 한수가 99개 이다.

 

 

import java.io.*;
import java.util.*;

class Main {  
  public static void main(String args[]) throws IOException{ 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String n = br.readLine();
    int result = 0;
    int tmp[] = new int[3];
    if(n.length() < 3){
      result = Integer.parseInt(n);
    }else{
      result = 99;
      for(int i=100; i<=Integer.parseInt(n); i++){
        tmp[2] = i % 10;
        tmp[1] = i / 10 % 10;
        tmp[0] = i / 100;
        int x = tmp[0] - tmp[1];
        int y = tmp[1] - tmp[2];
        if(x == y){
          result++;
        }
      }
    }
    System.out.println(result);
  } 
}

 

BufferedReader로 n을 입력 받습니다.

 

결과값을 출력하기 위한 result를 선언하고, 숫자가 세자리일 경우의 배열을 만듭니다.

 

입력 받은 n 의 길이를 측정합니다. 그 길이가 3 미만일 경우 에는 위에 설명 했던 것 처럼 1-9 , 10-99 인 경우이므로

 

한수의 개수는 n개가 됩니다.

 

길이가 3이상 일 경우로 계산했지만 이 문제는 1000보다 작거나 같은 수이고 1000은 한수가 아니므로 배열의 크기는 3개면 충분합니다.

 

99까지 한수가 99개이니 i를 100부터 n까지 반복하며, result 를 99로 초기화 해줍니다.

 

그러고 첫째 자리수와 두번째 자리수, 세번째 자리수를 구해서 배열에 담습니다. 

 

그 후 첫번째 자리수와 두번째 자리수를 빼서 나온 수와 두번째 수, 세번째 수를 빼서 나온 수가 같은지 계산합니다. 

(공차를 구하는 것)

 

만약 그 수가 서로 같다면 공차가 같은 것이므로 등차수열이고 한수입니다.  result 를 한개씩 더해줍니다.

 

결과값을 출력합니다.

 

반응형