문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
브루트 포스란.
모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.
이 문제에 핵심은 입력값이 몇 번째 자리수인가입니다.
왜냐하면 그 이하의 자릿수는 동일한 규칙으로 반복하기 때문입니다.
예를 들어 입력값이 872이면
자릿수는 100의 자리입니다.
100의 자리일 때 나올 수 있는 수는 100 ≤ n ≤ 872 입니다.
범위의 개수를 구하면 872 - 100 + 1 = 873개가 나옵니다.
그 이후에 10의 자리 숫자는 10 ≤ n ≤ 99 → 99 - 10 + 1 = 90
1의 자리 숫자는 1 ≤ n ≤ 9 → 1 - 9 + 1 = 9
해당 숫자의 자리수 이하는 9 * 10ⁿ의 비슷한 형태로 표현할 수 있습니다.
다른 예를 들면 입력값이 15206이면 만의 자리 숫자이므로
만의 자리가 나올 수 있는 수는 15206 - 10000 + 1 = 5207입니다.
그 이하의 자리수는 9000, 900, 90, 9개가 나올 것입니다.
자릿수마다 몇 개의 경우의 수가 나오는지 알았다면 이제 그 자릿수만큼 곱하기를 진행해서새로운 수의 자릿수를 구하면 됩니다.
위에 예시인 872에서
100의 자리는 773개, 자릿수는 3 → 773 * 3 = 2319
10의 자리는 90개, 자릿수는 2 → 90 * 2 = 180
1의 자리는 9개, 자릿수는 1 → 9 * 1 = 9
2319 + 180 + 9 = 2508개을 자릿수로 가지는 값이 나옵니다.
문제에 해결알고리즘은
1. 입력값에 자릿수를 찾습니다.
2. 해당 자릿수에 나올 수 있는 값의 개수를 구합니다.
3. 그 이하의 자릿수는 9 × 10ⁿ의 방식으로 개수를 구합니다.
4. 자릿수 개수와 값의 개수를 곱한 값을 더해줍니다.
5. 위 과정을 반복하여 모든 자릿수의 값들의 합을 결과로 출력합니다.
- BufferedReader를 사용하여 입력 값을 저장하였습니다.
- while문을 사용하여 최대 자릿값 100,000,000을 기준으로 줄여가며 입력값 자릿수를 찾았습니다.
- 해당 자릿수의 개수를 구한 뒤 그 이하의 자릿값은 9 × 10ⁿ방식으로 구하였습니다.
- BufferedWriter에 자릿수마다 나올 수 있는 값들을 모두 더하여 새로운 수의 자릿수를 저장하였습니다.
- BufferedWriter에 저장된 결과값을 출력하였습니다.
결과 코드
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//입력값 처리하는 BufferedReader
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//결과값 출력하는 BufferedWriter
int N = Integer.parseInt(br.readLine()); //입력값
int result = 0; //결과값
int maxValue = 1000000000; //자릿수 기본값
int i=10; //자릿수
boolean check = false; //입력값 자릿수 찾았는지 확인
while(maxValue!=0) {
//자릿수 감소
i--;
maxValue /= 10;
if(check) { //자릿수 찾았을 때 9 × 10ⁿ 진행
result += (maxValue*9)*i;
continue;
}
if(N>=maxValue) { //입력값 자릿수일 때 개수
result += (N-maxValue+1)*i;
check = true;
}
}
//------결과 저장 및 결과 출력-------
bw.write(result + "\n");
bw.flush();
bw.close();
br.close();
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:22,우선순위 큐,JAVA)1655번, 가운데를 말해요 (0) | 2022.03.09 |
---|---|
[백준] code.plus(브루트포스,JAVA)9095번, 1, 2, 3 더하기 (0) | 2022.03.09 |
[백준] 단계별로 풀어보기(단계:22,우선순위 큐,JAVA)11286번, 절댓값 힙 (0) | 2022.03.08 |
[백준] code.plus(브루트포스,JAVA)6064번, 카잉 달력 (2) | 2022.03.07 |
[백준] 단계별로 풀어보기(단계:22,우선순위 큐,JAVA)1927번, 최소 힙 (0) | 2022.03.07 |
댓글