곽로그

[백준 1065] 한수 본문

알고리즘/백준

[백준 1065] 한수

일도이동 2019. 4. 19. 12:27
반응형

 

 

1065번: 한수

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

www.acmicpc.net

접근법

 주어진 수의 각 자리수가 등차수열을 이루느냐를 판별하는게 관건이다. 그런데 여기서 한자리수, 두자리수(1,2,3, ...15...99)는 그냥 등차수열을 이룬다. 따라서 N이 100 이하의 수로 주어지면 N보다 작거나 같은 한수의 개수는 N개가 된다. 

 

 주어진 입력의 범위가 1000이하 인데 1000은 등차가 아니므로 제외하면 100부터 999까지의 수가 입력되었을 때 한수의 개수를 구하면 된다. 예를 들어 120이 입력되었다고 한다면 1부터 99까지 한수의 개수는 99개 이므로 100부터 120까지 한수의 개수를 구하면 된다. 

 

1) N을 입력받는다

2-1) 만약 N이 100보다 작은 수이면 N을 출력한다

2-2) 그 외의 경우에 100부터 N까지 한수의 개수를 count하고 count+99를 출력한다

 

대강의 개요는 위와 같다. 그러면 이제 이걸 구체화 해보자. 2-2를 구체화 하고 이걸 그대로 코드로 옮기면 된다. 

 

 N이 100보다 크면 100부터 N까지의 수를 순회하며 이 수들이 한수가 되는지를 확인하면 된다. 만약 한수라면 count를 하고, 순회가 끝나면 count에 99를 더한 값을 출력한다. 따라서 for(i=0;i<=N;i++)안에 if( i가 한수라면) count를 하나 증가 시켜라 정도가 된다. 그럼이제 i가 한수라면 에대한 구현을 하면 되는데, 이 문제에서 N의 범위가 세자리이기 때문에 굳이 배열을 선언할 필요 없이 변수로 일의 자리수, 십의자리수, 백의자리수를 구하면 된다. 그리고 이에 대한 부분을 함수로 처리하면 된다. 각 자리수를 구해서 이 자리수들이 등차수열을 이루는지를 확인하는 로직은 다양하기때문에 생략.

 

 

 

 

import java.util.Scanner;

//어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다.
//N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 
public class Main {
	public static boolean Hansu(int num) {
		int numOne=num%10;
		int numTen=(num/10)%10;
		int numHun=num/100;
		if((2*numTen)==(numOne+numHun)){
			return true;
		}
		else {
			return false;
		}
	}
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int N=in.nextInt();
		int count=0;


		if(N<100) {
			System.out.println(N);
		}
		else {
			for(int i=100;i<=N;i++) {
				if(Hansu(i)) {
					count++;
				}
			}
			System.out.println(count+99);	
		}


	}

}

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 8958] OX퀴즈  (0) 2019.04.24
[백준 2577] 숫자의 개수  (0) 2019.04.22
[백준 4673] 셀프 넘버  (0) 2019.04.18
[백준 1110] 더하기 사이클  (0) 2019.04.18
[백준 4344] 평균은 넘겠지  (0) 2019.04.17
Comments