문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
<작성 답안>(복사시, 코드 줄정렬은 ctrl+ shift+f)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int cnt = 0;
for(int i = 1; i<=N; i++) {
if(i>=100) {
if((i / 100) - (i % 100 / 10) == (i % 100 / 10) - (i % 10))
cnt++;
}
else {
cnt++;
}
}
s.close();
System.out.println(cnt);
}
}
어.... 한번에 맞았다?
<답안>
우리가 풀 문제는 각 자리수가 등차수열을 이루고 있는지를 검사하는 문제다.
근데 잘 보면 1 ~ 1000 까지의 수 중 검사할 수는 100~1000 까지 밖에 없다.
생각해보자. 1 ~ 99 는 모두 등차 수열이다.
1 ~ 9 는 수가 하나 그 자체로 수열에 속한다.
10 ~ 99 또한 각 자리수의 차가 공차이고 그 수 자체로 수열을 이룬다.
예로들면 31 은 공차가 -2 인 수열이고, 38 은 공차가 5 인 수열이다.
그러면 우리가 알고리즘을 짤 때 생각해야 할 것은 100 보다 작은 수와 100 보다 큰 수의 케이스를 나누어 생각하면 되겠다.
1. 먼저 arithmetic_sequence 라는 함수와 해당 함수 안에 한수의 개수를 셀 cnt 라는 변수를 선언한다.
이 함수는 등차수열 메서드다.
public static int arithmetic_sequence(int num){
int cnt = 0; // 한수 카운팅
if(num < 100){
return num;
}
else {
cnt = 99;
for(int i = 100; i <= num; i++){
int hun = i / 100; // 백의 자릿수
int ten = (i / 10) % 10; // 십의 자릿수
int one = i % 10;
if((hun - ten) == (ten - one)){ // 각 자릿수가 수열을 이루면
cnt++;
}
}
}
return cnt;
}
굳이 정답을 찾아쓰는 이유는 내 작성답안은 값이 커질 수록 저 복잡한 if문 조건을 복잡하게 재업해줘야하기 때문이다.
정답출처:https://st-lab.tistory.com/54
'📟java > 백준' 카테고리의 다른 글
백준 10809 자바 (0) | 2022.11.10 |
---|---|
백준 11654 자바 (0) | 2022.11.10 |
백준 15596 자바 (0) | 2022.11.09 |
백준 4344 자바 (0) | 2022.11.09 |
백준 1546 자바 (1) | 2022.11.08 |