반응형
- start%10 가 0이 될때까지 start++를 한다. 이 과정에서 start에 나오는 숫자의 갯수를 세준다.
- end%10가 9가 될때까지 end--를 한다. 이 과정에서 end에 나오는 숫자의 갯수를 세준다.
- 0~9 모두에 (end-start+1)*t를 더해준다. 이때 t의 값은 어떤 자리수를 세는지에 따라 다르다. 예를 들어 일의 자리를 센다면 t=1이고 십의 자리를 센다면 t=10이다.
- 십의 자리를 셀때는 일의 자리를 셀 동안 계속해서 반복적으로 나오기 때문이다.
- 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;
}
}
연습할 문제
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 |