본문 바로가기
문제 풀이/BAEKJOON

[백준/JAVA] 1065번. 한수

by 망고 ෆ 2021. 8. 4.
문제
 

1065번: 한수

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

www.acmicpc.net

 

 

풀이

 

등차 수열이란 연속한 두 항의 차가 일정한 값인 수열을 의미하고, 문제에서 한수란 어떤 양의 정수의 각 자리가 등차수열을 이루는 것을 의미한다. 

먼저, 1~1000까지의 수만 입력받으므로 한자릿수인 경우, 두 자릿수인 경우 등 각 자릿수의 개수 별로 나눠서 확인해 볼 것이다.

 

1) 한자릿수 (1~9) : 연속한 항이 더 이상 없으므로 그 자체로 한수라고 할 수 있다.

 

2) 두 자릿수 (10~99) : 각 자릿수의 차가 공차이고 공차가 하나뿐이므로 이 자체로 한수라고 할 수 있다.

 

3) 세 자릿수 (100~999) : (백의 자릿수 - 십의 자릿수)의 값과 (십의 자릿수 - 일의 자릿수)의 값이 같은지 확인해보아야 한다.

 

4) 1000 : 각 자릿수의 차가 다르므로 한수가 아니다.

 

따라서, 세 자릿수 (100~999) 부분만 알고리즘을 짜면 된다. 1~99는 모두 한수라고 count 해주며, 1000인 경우는 count 하지 않도록 하면 된다. 코드는 다음과 같다.

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()); //N의 값 입력받음
		int result = 0;
		for(int i=1; i<=N; i++) { //1부터 N까지의 한수의 개수
			result += hanSu(i); 
		}
		System.out.println(result); //한수의 개수 출력
	}

	static int hanSu(int n) {
		int cnt = 0; //한수의 수 저장
		if(n>=100 && n<1000) { 
			int hun = n/100; //백의 자릿수
			int ten = (n/10)%10; //십의 자릿수
			int one = n%10; //일의 자릿수
			if((hun-ten)==(ten-one)) { //연속된 두 수의 차이가 일정하면
				cnt++; 
			}
		} else if(n<100) {
			cnt++; // 두자릿수는 모든 수가 그 자체로 수열이므로 count
		} else if (n==1000){
			cnt = 0; //1000은 한수의 수 0개
		}
		return cnt;
	}
}

댓글