컴퓨터 공학/백준

[백준] 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개만 비교하는 방법이 있었다...

와 나는 왜 이걸 생각을 못 했지? 단순히 문제를 푸는 것을 넘어서 앞으로 가독성이나 효율성을 좀 따져야 할 것 같다...