[백준 1065번] 한수(JAVA)
서론
각 자리의 수에 대해 물어보는 문제가 나오면 이제 자신있게 풀 수 있을 것 같다.(나누고(/)! 나머지 구하고(%)!)
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
시행착오(Trial&Error)
51451444, 51451601 - 틀렸습니다
문제의 예제 입력 4를 보자.
1000을 입력하면 144가 나와야 한다.
즉, 1000은 한수에 해당하지 않는데, 1000까지 한수로 포함했기 때문에 '틀렸습니다'가 나온 것이다.
조건문에서 1000을 제외하도록 코드를 수정했다.
if(i < 100) {
cnt++;
} else if((b - a) == (c - b)) {
if(i != 1000) // <== 1000인 경우를 제외했다.
cnt++;
}
풀이(Solution)
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다.
각 자리 수를 식으로 표현할 수 있어야 한다.
입력 받을 수가 1000 이하의 수이기 때문에 각 자리 수를 구해주면 되는데 필자는 넷 째 자리 수는 제외했다.
첫째자리 수 : X % 10;
둘째자리 수 : X / 10 % 10;
셋째자리 수 : X / 100 % 10;
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다.
'등차수열을 이룬다면'을 조건문의 조건식으로 표현해야 한다.
셋째자리 수와 둘째자리 수의 차가 둘째자리 수와 첫째자리 수의 차가 같아야 할 것이다.
예제 입력 1 & 2
예제 입력 1, 2를 확인해보았다면, 1부터 99까지는 무조건 한수임을 알 수 있다.(비교대상이 없기 때문인듯)
따라서 100이하의 수는 무조건 한수로 처리해주면 된다.
코드
import java.io.*;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 1,000보다 작거나 같은 자연수
br.close();
int a, b, c;
int cnt = 0;
for(int i = 1; i <= N; i++) {
// 1000을 기준으로 각 자리의 수를 구해보자.
a = i / 100 % 10; // 셋째 자리
b = i / 10 % 10; // 둘째 자리
c = i % 10; // 첫째 자리
// a가 0일 경우는 b부터 센다. - 두 자리 수 => 모두 한수
// a와 b가 0일 경우 - 한 자리 수 => 모두 한수
// 등차수열은 연속된 두 개의 수의 차이가 일정한 수열
// b - a 가 c - b 와 d - c와 같아야 한다.
if(i < 100) {
cnt++;
} else if((b - a) == (c - b)) {
if(i != 1000)
cnt++;
}
}
System.out.println(cnt);
} catch(IOException e) {}
}
}