컴퓨터 공학/백준
[백준] JAVA 자바 : 한수 (1065번)
kim-dev
2024. 5. 18. 11:38
반응형
1보다 크고 N보다 작거나 같은 한수의 개수를 출력하는 문제이다.
그런데 풀다 보면서 느끼는 건데... 완전 탐색이 그리디보다 어려운 것 같다... 아직 얼마 안 풀어봐서 그런가...?ㅋㅋㅋ
전부를 탐색해야 해서 은근 고려할 게 많은 느낌...?
여튼, 난 어떻게 구현했냐면
1~99까지는 모두 등차수열이다. 당연히 모든 자릿수의 차이가 똑같으니까!
그럼 우리가 구해야할 부분은 100~1000 사이의 수이다.
일의자리 수와 십의자리 수의 차이를 먼저 구한 후(diff), 나머지 자릿수를 돌면서 두 자릿수의 차이가 diff와 모두 같다면 한수로 저장한다. 만약 한 자리라도 틀리게 된다면 그 수는 한수가 아니게 된다.
1000까지 모두 검사한 후, 1부터 N까지 돌면서 한수의 개수를 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class OneNumber {
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] list = new int [1001];
// 1부터 99까지는 모두 등차수열
for (int i=1; i<=99; i++) {
list[i] = 1;
}
// 100 이상의 수부터 한수인지 검사
for (int i=100; i<1001; i++) {
int no = i;
int diff = (no%10) - ((no/10)%10); // 두 값의 차이
no /= 10;
// 한자리 수만 남을 때까지 계속 10으로 나누면서
while (no > 9) {
if ((no%10) - ((no/10)%10) == diff) { // 인접한 두 수의 차이가 diff와 같은지 검사
list[i] = 1; // 같으면 1로 바꿈
} else {
list[i] = 0; // 안 차례라도 다르면 0
break;
}
no /= 10;
}
}
int N = stoi(br.readLine());
int count = 0;
for (int i=1; i<=N; i++) {
if (list[i] == 1) {
count++;
}
}
System.out.println(count);
}
}
다른 분들의 풀이를 보니까, 100부터 1000까지만 검사하면 되므로 굳이 나처럼 가독성을 버리면서 코드를 만들지 않아도,
백의자리, 십의자리, 일의자리 3개의 int 변수를 만들어서 담아서 이 3개만 비교하는 방법이 있었다...
와 나는 왜 이걸 생각을 못 했지? 단순히 문제를 푸는 것을 넘어서 앞으로 가독성이나 효율성을 좀 따져야 할 것 같다...