1081

qkrrnjswo·2023년 4월 6일
0

백준, 프로그래머스

목록 보기
18/53

1059. 좋은 구간

	수학
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int L = sc.nextInt();
        int U = sc.nextInt();

        Sum s = new Sum();
        //U의 자리수의 합 - L까지(L포함)의 자리수의 합 + L의 자리수의 합
        long result = s.calcNum(U)-s.calcNum(L)+s.sumNums();
        System.out.println(result);
    }
}

class Sum{
    long[] sum = new long[9];
    int[] nums = new int[10];
    Sum(){
        Arrays.fill(nums, 0);

        //0-9
        sum[0] = 45;
        //0-99 0-999 0-9,999  ...  0-999,999,999 까지 각각의 자리수를 더한 값
        for (int i = 1; i < sum.length; i++) {
            sum[i]=0;
            for (int j = 0; j < 10; j++) {
                sum[i] += sum[i-1] + Math.pow(10, i)*j;
            }
        }
    }
    public int sumNums(){
        int result = 0;
        for (int i : nums) {
            result += i;
        }
        return result;
    }
    public long calcNum(int num) {
        Arrays.fill(nums, 0);
        long result = 0;
        //큰 자리수들의 합
        int mNum = 0;

        //num의 자리수 판별 => 각 자리의 숫자 알기
        for(int i = 0; num != 0; i++){
            nums[i] = num%10;
            num /= 10;
        }

        //큰 자리수(10자리수) 부터 계산(1자리 제외)
        for(int i = nums.length-1; i> 0; i--) {
            for (int j = 0; j < nums[i]; j++) {
                result += sum[i-1] + Math.pow(10, i)*j + Math.pow(10, i)*mNum;
            }
            mNum += nums[i];
        }

        //1의 자리 수 더하기
        for (int i = 0; i <= nums[0]; i++) {
            result += i + mNum;
        }

        return result;
    }
}

0개의 댓글