알고리즘/브루트포스

[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();
    }
}