관리 메뉴

LC Studio

백준 1065 한수 (JAVA) 본문

Java/백준 알고리즘

백준 1065 한수 (JAVA)

Leopard Cat 2022. 3. 16. 10:43

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

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

 

복잡했지만 차근차근 식을 세워 풀어보았다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); //첫번째 입력 읽어오기
        int lastSum = 0; //최종 값

        for(int i=1;i<=N;i++){
            int A = d(i); //d()함수 호출
            lastSum = lastSum + A; //최종값에 A 더하기
        }
        System.out.println(lastSum); //최종출력


    }

    public static int d(int number){
        int num = number; //main 함수에서 받아온 i값 num에 저장
        int sum = 0; 
        if(num<100){ //100보다 작으면 무조건 한수이기때문에 1 return
            return 1;
        }
        else{
            String st = Integer.toString(num);
            int[] array = new int[st.length()]; //num의 길이를 알아내 배열생성
            int i = 0;
            
            while(num != 0){
                array[i] = num%10; //한 자리씩 저장
                num = num/10; 
                i++;
            }
            for(int j=0;j<st.length()-2;j++){
                if(array[j+1] - array[j] == array[j+2]-array[j+1]){ //인접한 2항의 차가 같다면
                    sum = sum + 1; //sum을 ++
                }
            }
            if(sum/(st.length()-2) == 0){ //위의 if문에서 모두 true여서, 딱 나누어 떨어진다면
                return 1; //1 return
            }
            else{
                return 0;
            }
        }
    }
}

위와같이 설계해 보았지만 잘 작동하지 않았다...

결국 다른 블로그를 참고해 보았다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); //첫번째 입력 읽어오기
        int A = d(N); //d()함수 호출

        System.out.println(A); //최종출력
    }

    public static int d(int number){
        int num = number; //main 함수에서 받아온 i값 num에 저장 
        int cnt = 0; //한수의 개수
        
        if(num<100){ //100보다 작으면 무조건 한수이기때문에 return num
            return num;
        }
        else{
            cnt = 99;
            
            if(num==1000){ //자리수 계산을 위한 예외처리
                num = 999;
            }
            
            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;
        }
        
    }
}

아... 아쉽다

기본적으로 생각한 방향이 같았는데, 문제를 자세히 분석하지 않아 너무 어렵게 풀었다.

1000까지라고 문제에서 말해줬는데, 너무 광범위하게 생각하다보니 식이 복잡해 진 것 같다.

다음부터는 문제를 더 철저히 분석해야겠다.

반응형

'Java > 백준 알고리즘' 카테고리의 다른 글

백준 2908번 상수 (JAVA)  (0) 2022.03.17
백준 1157 단어공부 (Java)  (0) 2022.03.17
백준 4673 셀프 넘버 JAVA  (0) 2022.03.15
백준 4344 평균은 넘겠지 (Java)  (0) 2022.03.15
백준 8958번 (JAVA)  (0) 2022.03.14