https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

 

이 문제를 풀면서 내가 예상하지 못한 무한루프에 빠지게 되었었다. 끝없는 고민 끝에 그 이유를 찾아냈고, 다시는 똑같은 잘못을 하지 않도록 그 이유를 기록하는 것에 목적을 두도록 한다.

 

먼저, 문제에서는 N이 1000보다 작거나 같긴 한데, 나는 좀 더 나아가서 N이 세자리수든 네자리수든 문제보다 더 큰 N이 왔을 때도 한수를 구할 수 있도록 코드를 작성해보고 싶었다.

 

먼저, 

내가 무한 루프에 빠지게 됐던 잘못된 코드를 저장해두도록 하겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
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;
        for (int i = 1; i <= N; i++) {
            String iStr = i + "";
            if (iStr.length() > 2) {
                int[] arr = new int[iStr.length()];
                int m = 0;
                while (i != 0) {
                    arr[m] = i % 10;
                    i = i / 10;
                    m++;
                }
                int k = arr[1- arr[0];
                boolean b = true;
                for (int j = 1; j < arr.length; j++) {
                    if (arr[j] - arr[j - 1!= k) {
                        b = false;
                    }
                }
                if (b) {
                    count++;
                }
 
            } else {
                count++;
            }
 
        }
        System.out.println(count);
 
    }
}
cs

 

어디서 잘못됐을까?

 

while (i != 0) {
arr[m] = i % 10;
i = i / 10;
m++;
}

이 부분에서 i의 자릿수를 줄여가며 각각의 일의 자리 수를 받아 배열에 저장하는 과정에서 결과적으로 i는 늘 0이 된다는 것을 놓쳤다...

이후 다시 i++이 되어 다시 i는 1부터 for문을 돌기 시작한다. 그리고 1 ~ 99까지는 count가 되지만, 100이 됐을 때 i는 다시 0이 되어버리고, 다시 1부터 for문을 도는...무한루프..

 

그래서 i 값을 다른 변수(int n)에 저장해두어서 그 변수를 통해 while문을 돌리도록 하였다.

그 결과 코드를 작성해보면 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
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;
        for (int i = 1; i <= N; i++) {
            String iStr = i + ""// 숫자가 몇자리 수인지를 파악하기 위해 문자열로 바꿔줬다.
            if (iStr.length() > 2) { // 세자리 수 이상의 경우!
                int[] arr = new int[iStr.length()]; // 자릿수 만큼의 배열의 크기를 갖는 배열 생성
                int m = 0// arr 배열의 인덱스의 역할을 하기 위한 변수 선언
                int n = i; // i값(파악하고자 하는 수)을 다른 변수에 저장해둔다.
                while (n != 0) {
                    arr[m] = n % 10// 일의 자리수를 배열에 하나씩 넣어준다.
                    n = n / 10;      // 자릿수를 줄여나가면서(예: 123 -> 12 -> 1 -> 0)
                    m++;              // 인덱스 증가시킴
                }
                int k = arr[1- arr[0]; // 등차수열을 이루는지 확인하기 위해 자릿수 사이의 차이를 하나 구해놓는다.
                boolean b = true;
                for (int j = 1; j < arr.length; j++) {
                    if (arr[j] - arr[j - 1!= k) {
                        b = false;    // 차이가 하나라도 다른게 있으면 false가 돼서 한수가 아닌 것으로 판단
                    }
                }
                if (b) { // 차이가 모두 일정하다는 것이므로 한수에 해당
                    count++;
                }
 
            } else { // 1 ~ 99 의 경우 그대로 한수가 된다.
                count++;
            }
 
        }
        System.out.println(count);
 
    }
}
cs

 

 

+ Recent posts