문제
어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
--------------------------------------------------------------------------------------------------------------------
문제 이해하는데 오래걸렸다.
연속된 숫자의 차이가 일정한 수열은 등차수열. 그 갯수를 출력하는 프로그램이다.
등차수열이란 ????
한자리의 숫자는 무조건 등차수열 1~9
두자리의 숫자도 무조건 등차수열 10~99
ex) 46 -> 4 에서 6까지 2의 차이
세자리는 계산이 필요하다.
ex)
1 3 5 -> 일정하게 2의 차이
1 3 6 -> 2와 3. (등차수열 x)
4 4 4 -> 일정하게 0의 차이
1 2 3 -> 일정하게 1의 차이
7 4 1 -> 일정하게 3의 차이
숫자 777이 입력되었을 때 1 부터 777까지의 숫자가 등차수열인지 아닌지 구해서 등차수열이면 그 수를 구하는 프로그램이다.
즉, 숫자하나 하나 자리수를 잘라서 앞뒤 비교하란 얘기, 시작할 때 1과 2를 비교하는게 아니라 1 하나만 등차수열인지 구하는거다
<풀이>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int count = 0; // 입력받은 수만큼 loof for(int i = 1; i <= num; i++) { if(getHansuChk(i)) { // 등차수열이면 count++ count++; } } System.out.println(count); } // 등차수열인지 체크하는 함수 public static boolean getHansuChk (int num) { boolean hansuResult = true; // 숫자를 배열에 자릿수대로 담기 String temp = Integer.toString(num); int length = temp.length(); int[] digitsArr = new int[length]; for(int i=0; i<length; i++) { digitsArr[i] = temp.charAt(i)-'0'; } // 두자리 이하는 다 등차수열에 만족하므로 한수임 (3자리이상만 계산하면 된다.) if (num > 99 && num <= 1000) { int firstValue = 0; int tempValue = 0; // 자리수 만큼 loof 돌면서 앞뒤자리 차이를 비교 for(int i=0; i<length-1; i++) { firstValue = digitsArr[i] - digitsArr[i+1]; if(i != 0 && firstValue != tempValue) { // 한수가 성립되지 않으면 break hansuResult = false; break; } tempValue = firstValue; } } return hansuResult; } } | cs |
'DEV > 알고리즘' 카테고리의 다른 글
백준 알고리즘 1152 단어의 개수 (0) | 2019.05.23 |
---|---|
백준 알고리즘 4673 , 셀프 넘버 풀이 (0) | 2019.05.23 |
1~100,000 사이의 소수구하기 (0) | 2019.04.05 |
특정숫자의 n승 (n제곱) 구하기 (0) | 2019.04.05 |