알고리즘 문제 풀이/BOJ 골드
[백준] 1081 - 합
natonato
2021. 4. 20. 22:24
1081번: 합
L보다 크거나 같고, U보다 작거나 같은 모든 정수의 각 자리의 합을 구하는 프로그램을 작성하시오.
www.acmicpc.net
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);
}
}