새소식

백준

백준 - 6-3(한수) 풀이

  • -

백준(java) - 6-3(한수) 풀이

문제

  • 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력

  • 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

  • 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int count = 0;

        String arr[] = new String[N];

        for (int i = 0; i < N; i++) {
            // arr[i]에 값을 저장한다.
            arr[i] = Integer.toString(i + 1);
            // 잘 담겼는지 확인을 위해 출력
//            System.out.println(arr[i]);

            if(arr[i].length() == 1){
                count++;
                continue;
            }

            // arr[i]의 자릿수 길이 만큼의 길이를 가진 c[]를 선언 (c[]의 각 자리에 각 숫자를 담아 비교하기 위해)
            int c[] = new int[arr[i].length()];
            int differance = 0;
            int lastDifferance = 0;
            int result = 0;
            for(int j = 0; j < arr[i].length(); j++){
                // c[j]에 arr[i]의 각 자릿수 숫자를 담는다.
                c[j] = arr[i].charAt(j) - '0';

                // c[]의 모든 숫자들을 꺼내서 각 숫자들의 차이를 비교하고 그 비교가 모두 같으면
                // count++를 실행해 한수의 총 갯수를 1 늘린다(10 미만의 수들을 if,continue를 통해 하이패스로
                // count++를 실행한다.
                for(int k = 1; k < c.length; k++){
                    // 첫번째 숫자와 두번째 숫자의 차이를 기본 differance로 저장하고 후에 나오는 차이는
                    // lastDifferance로 저장해서 두 값이 같은지 비교한다.
                    // lastDifferance는 계속 갱신되어야 한다.
                    if(k == 1){
                        differance = c[k] - c[k - 1];
                        lastDifferance = differance;
                    } else {
                        lastDifferance = c[k] - c[k - 1];
                    }

                    if(lastDifferance == differance){
                        result = -1;
                    } else {
                        result = 0;
                    }
                }
                // 한수임을 확인하는 코드에서 한수임이 확인 됐다면 result를 -1로 값을 변경한다.
                // 만약 한수가 아니라면 result를 0으로 변환시킨다.
            }
            if(result == -1){
                count++;
            }
        }
        System.out.println(count);
    }
}

후기

  • 여태까지 풀었던 백준 문제 중 가장 어려웠다. 이렇게 푸는게 맞는지는 모르겠지만, 3중 for문 안에 여러 개의 조건문을 넣어 생각에 생각을 거듭하며 풀었고 코드가 복잡해지다보니 주석을 달지 않고는 내 코드를 알아 볼 수가 없었다. 처음으로 주석을 필요에 의해서 달게 되었고, 또한 주석의 중요성도 뼈저리게 깨달았다.
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.