문제
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;
}
}
'문제 풀이 > BAEKJOON' 카테고리의 다른 글
[백준/Python] 10818번. 최소, 최대 (0) | 2021.09.18 |
---|---|
[백준/JAVA] 11654번. 아스키 코드 (0) | 2021.08.05 |
[백준/JAVA] 4673번. 셀프 넘버 (0) | 2021.08.01 |
[백준/JAVA] 1546번. 평균 (0) | 2021.07.31 |
[백준/JAVA] 2577번. 숫자의 개수 (0) | 2021.07.28 |
댓글