본문 바로가기
백준

[백준] code.plus(브루트포스,JAVA)1748번, 수 이어 쓰기 1

by 열정적인 이찬형 2022. 3. 8.

문제 링크

 

1748번: 수 이어 쓰기 1

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

www.acmicpc.net


주의사항

  • 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();
    }
}

댓글