📟java/백준

백준 1065 자바

하얀성 2022. 11. 10. 11:52

문제

어떤 양의 정수 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