0. 1019번, 책 페이지의 코드 재사용 (링크)
1. 두 페이지까지의 숫자를 구해 합을 구하고, 그 차이를 구한다
- L페이지는 포함되야 하므로, 따로 합해준다
* SWEA 5604번 구간합 문제와 거의 동일하다 (링크)
- 출력 양식 수정 후 반복문만 돌리면 통과
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String n = st.nextToken();
String m = st.nextToken();
long temp = page(m)-page(n);
for (int i = 0; i < n.length(); i++)temp+=n.charAt(i)-'0';
System.out.println(temp);
}
static long page(String N) {
long returnVal=0;
long[]page = new long[10];
long[]prev = new long[10];
long[]ans = new long[10];
int len = N.length();
ArrayList<long[]>index=new ArrayList<>();
index.add(page.clone());
long cnt=1;
//전처리
for (int i = 0; i <= len; i++) {
for (int j = 0; j <= 9; j++) {
page[j]*=10;
page[j]+=cnt;
}
index.add(page.clone());
cnt*=10;
}
//0번 자리부터
for (int i = 0; i < N.length(); i++, len--) {
int cur = N.charAt(i)-'0';
long[] curIdx = index.get(len-1);
long repeat = (long)Math.pow(10, len-1);
for (int j = 0; j <= 9; j++) {
ans[j]+=curIdx[j]*cur;
ans[j]+=prev[j]*repeat*cur;//prev처리
}
//가장 앞자리 처리
for (int j = 0; j < cur; j++) {
ans[j]+=repeat;
}
prev[cur]++;
}
for (int j = 0; j <= 9; j++) ans[j]+=prev[j];
for (int i = 0; i < N.length(); i++) ans[0]-=Math.pow(10, i);
for (int i = 0; i <= 9; i++) {
returnVal+=i*ans[i];
}
return returnVal;
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글
[백준] 1261 - 알고스팟 (0) | 2021.04.21 |
---|---|
[백준] 2458 - 키 순서 (0) | 2021.04.21 |
[백준] 15683 - 감시 (0) | 2021.04.21 |
[백준] 1167 - 트리의 지름 (0) | 2021.04.18 |
[백준] 1238 - 파티 (0) | 2021.04.18 |
[백준] 1967 - 트리의 지름 (0) | 2021.04.18 |
[백준] 2263 - 트리의 순회 (0) | 2021.04.16 |