알고리즘/브루트포스
[BOJ] 백준 1065 - 한수 풀이
송승현(SSH)
2022. 11. 7. 23:38
1. 문제
https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
2. 풀이
백준 실버4 브루트포스 알고리즘에 해당하는 문제이다.
어떤 양의 정수의 각 자리가 등차수열을 이룬다면 그 수는 한수이다. 문제는 1부터 입력으로 주어지는 수의 범위까지의 수 중 한수가 몇 개가 있느냐를 묻는 문제이다.
우선 연속된 두 개의 수의 차이를 비교해야 한다. 이 말은 1부터 99까지는 차이를 비교할 피연산자가 2개 뿐이므로 1부터 99까지는 무조건 한수이다. 100이상은 2가지의 방법이 존재한다. (본 포스팅에서는 문자열로 변환하는 코드를 소개한다.)
1. 문자열로 변환 방법
수를 String으로 변환 후 앞 두자리(0 번째, 1 번째)의 차이를 구한 후 나머지 자리수의 차이가 처음에 구한 차이와 일치하지 않는다면 flag를 거짓으로 바꾸고 반복문 끝에 flag에 값에 따라 한수인지 한수가 아닌지를 판단하여 카운트를 더해준다.
2. 자리수를 구하는 방법
각 수의 자리수를 구하여 그 차이가 등차수열을 이룬다면 카운트를 더해주는 방식이다.
< 각 자리수를 구하는 방법 >
백의 자릿수 = i / 100
십의 자릿수 = (i / 10) % 10
일의 자릿수 = i % 10
3. 소스 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int result = 0;
int N = Integer.parseInt(br.readLine());
for (int i = 1; i <= N; i++) {
if (i <= 99) {
result += 1;
continue;
}
boolean flag = true;
String NumToString = Integer.toString(i);
int differentNum = (NumToString.charAt(0) - '0') - (NumToString.charAt(1) - '0');
for (int j = 1; j < NumToString.length() - 1; j++) {
int differentLoop = (NumToString.charAt(j) - '0') - (NumToString.charAt(j + 1) - '0');
if ((differentLoop) != (differentNum)) {
flag = false;
break;
}
}
if (flag) {
result += 1;
}
}
bw.write(Integer.toString(result));
bw.flush();
bw.close();
br.close();
}
}