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 |
'알고리즘 및 코테 > 백준' 카테고리의 다른 글
백준 4673번. 셀프 넘버 - Java(자바) (0) | 2023.02.15 |
---|---|
백준 1110번: 더하기 사이클(Java) (0) | 2023.01.18 |