반응형
https://www.acmicpc.net/problem/1065
- 문제
- 문제 풀이
백준 1065번 한수는 실버 4 난이도의 브루트 포스 문제이다. 만약에 자연수 N의 각 자리가 등차수열을 이루면, 이 N을 한수라고 한다. 이 문제에서는 자연수 N이 주어진다. 그리고 N보다 작거나 같은 한수의 개수를 출력하면 되는 문제이다.
우선 10보다 작은 수들을 보겠다. 예를 들어서 1이나 3은 모두 한 자릿수여서 등차수열을 이룬다. 그래서 1부터 9까지는 전부 한수이다.
이제 10부터 99까지의 수들을 살펴보겠다. 예를 들어서 10의 각 자리를 보면 0과 1이고 0 - 1 = -1인데 비교 대상이 없으므로 두 자릿수, 즉 10에서 99까지의 수도 한수라는 것이다. 따라서 1부터 99까지는 전부 한수이다. 그래서 입력으로 99보다 작거나 같은 수가 주어지면 그대로 n을 출력해주면 된다.
이제 세 자릿수를 봐야 한다. 예를 들어서 100을 보겠다. 각 자리가 등차수열을 이루는지 확인하려면 다음과 같이 하면 된다. 우선 백의 자릿수, 십의 자릿수, 그리고 일의 자릿수를 구한다. 각각 int형 변수 hun, ten, one이라고 하겠다. 이 경우에는 hun = 1, ten = 0, one = 0이다. 그리고 등차수열을 이루려면 ten - hun == one - ten과 같아야 한다. 이 경우 -1 != 0이므로 100은 등차 수열이 아니다.
한수인지 아닌지 확인하는 함수를 만들어서 이 문제를 풀 수가 있다. 자세한 코드는 밑에 있다.
- 코드
import java.io.*;
import java.util.*;
public class Main {
static int count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if (n <= 99) { //99이하면 모든 자리가 등차수열을 이루므로 한수
System.out.print(n);
return;
}
count = 99;
for (int i = 100; i <= n; i++) { //100에서부터 한수인지 아닌지 확인
d(i);
}
System.out.print(count);
}
static void d(int n) { //한수인지 확인해주는 함수
boolean b = true; //true면 한수, false면 한수가 아님
String s = Integer.toString(n);
//우선 첫번째와 두번째 자리수의 차이를 구함
int x = Character.getNumericValue(s.charAt(1)) - Character.getNumericValue(s.charAt(0));
for (int i = 1; i < s.length() - 1; i++) {
//두번째와 세번째 자리수의 차이부터 구함
int c = Character.getNumericValue(s.charAt(i+1)) - Character.getNumericValue(s.charAt(i));
if (x != c) { //등차수열을 이루지 않으면 b는 false로 바꿈
b = false;
break;
}
}
if (b) count++; //한수이면 count + 1
}
}
반응형
'백준' 카테고리의 다른 글
[백준] 2440번 : 별 찍기 - 3 – JAVA [자바] (0) | 2022.07.09 |
---|---|
[백준] 7287번 : 등록 – JAVA [자바] (0) | 2022.07.09 |
[백준] 4673번 : 셀프 넘버 – JAVA [자바] (0) | 2022.07.08 |
[백준] 1157번 : 단어 공부 – JAVA [자바] (0) | 2022.07.08 |
[백준] 15596번 : 정수 N개의 합 – JAVA [자바] (0) | 2022.07.08 |
댓글