Algorithm/Baekjoon

[백준] 1065번 : 한수 - Java

unknownomad 2022. 3. 15. 22:35

https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net



주의점

1. 정의

1.1. 한수

  • 각 자릿수가 등차수열을 이루는 수

1.2. 등차수열

  • 연속된 두 개의 수의 차이가 일정한 수열

1.3. 예시1 - 753

  • 각 자릿수 : 7, 5, 3
  • 각 자릿수의 차이 : -2 씩 일정하게 감소 ➡ -2 = 공차

1.4. 예시2 - 222

  • 공차 = 0

 

2. 적용

2.1. 문제

  • 1보다 크고, 입력 받은 값보다 작거나 같은 한수의 개수 출력

2.1. 범위 1 ~ 9

  • 비교할 숫자가 없어 한수로 세는듯

2.2. 범위 10 ~ 99

  • 공차는 있으나 비교 대상이 없기에 한수로 세는듯
    (문제에 주어진 예제1을 보면 110 입력 시 99 나옴 ➡ 1 ~ 99는 한수로 세는듯)

풀이

1. Scanner

import java.util.Scanner;

public class Main { 
    public static void main(String[] args) {
    
        Scanner in = new Scanner(System.in);
        System.out.print(arithmetic_sequence(in.nextInt()));
        in.close();
    }
 
    public static int arithmetic_sequence(int num) {

        int cnt = 0; //한수 개수
        if (num < 100) { //1 ~ 99 : 한수 범위
            return num;
        } else {
            cnt = 99;
            
            //1000 : 등차수열 X, 1000보다 큰 수는 입력받지 X
            //num == 1000일 경우, num = 999;로 변경해야 함(예외 처리)
            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;
    }
}

 

2. BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print(arithmetic_sequence(Integer.parseInt(br.readLine())));
    }
 
    public static int arithmetic_sequence(int num) {
        int cnt = 0; //한수 개수
        if (num < 100) {
            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;
    }
}

성능

  • BufferedReader > Scanner

 


출처 : https://st-lab.tistory.com/54