본문 바로가기

알고리즘/팁

특정 구간에 0~9의 숫자 갯수 찾기

반응형
  1. start%10 가 0이 될때까지 start++를 한다. 이 과정에서 start에 나오는 숫자의 갯수를 세준다.
  2. end%10가 9가 될때까지 end--를 한다. 이 과정에서 end에 나오는 숫자의 갯수를 세준다.
  3. 0~9 모두에 (end-start+1)*t를 더해준다. 이때 t의 값은 어떤 자리수를 세는지에 따라 다르다. 예를 들어 일의 자리를 센다면 t=1이고 십의 자리를 센다면 t=10이다.
    • 십의 자리를 셀때는 일의 자리를 셀 동안 계속해서 반복적으로 나오기 때문이다.
  4. start > end 혹은 start == 0, end == 0일때 반복을 종료한다.
ans = 0;
long mul = 1;
while(A <= B) {
while(A%10 != 0 && A <= B) {
	check(A,mul);
	A++;
}
if(A > B || (A == 0 && B == 0)) break;
while(B%10 != 9 && A <= B) {
	check(B,mul);
	B--;
}
A/=10;
B/=10;
long m = (B-A+1)*mul;
for(int i = 0; i < 10; i++)
	ans+=m*i;
mul*=10;
}

 

	static void check(long n, long t) {
		while(n > 0) {
			ans+=(n%10)*t;
			n/=10;
		}
	}

연습할 문제

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXGGNB6cnEDFAUo&categoryId=AWXGGNB6cnEDFAUo&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

http://boj.kr/1019

 

1019번: 책 페이지

첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 출력한다.

www.acmicpc.net

package swea;

import java.util.Scanner;

public class Swea5604_구간합 {
	static int T;
	static long A,B;
	static long ans;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		T = sc.nextInt();
		for(int tc = 1; tc <= T; tc++) {
			A = sc.nextLong();
			B = sc.nextLong();
			ans = 0;
			long mul = 1;
			while(A <= B) {
				while(A%10 != 0 && A <= B) {
					check(A,mul);
					A++;
				}
				if(A > B || (A == 0 && B == 0)) break;
				while(B%10 != 9 && A <= B) {
					check(B,mul);
					B--;
				}
				A/=10;
				B/=10;
				long m = (B-A+1)*mul;
				for(int i = 0; i < 10; i++)
					ans+=m*i;
				mul*=10;
			}
			System.out.println("#"+tc+" "+ans);
		}
		sc.close();
	}
	
	static void check(long n, long t) {
		while(n > 0) {
			ans+=(n%10)*t;
			n/=10;
		}
	}
}

 

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

[Python] set 소소한 팁  (0) 2020.09.28
JAVA EOF 판단  (0) 2020.04.24
next permutation  (0) 2020.03.10
바이너리 카운팅을 통해 부분집합 생성  (0) 2020.02.18
BFS 거리 구하기 팁  (0) 2020.02.13