백준

[백준/BOJ] 1748번 : 수 이어 쓰기 1 (JAVA / 자바)

코메인 2022. 3. 21. 19:49

안녕하세요~ 코딩하는 코알못 코메인입니다.

 

 

https://www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

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

www.acmicpc.net


- 문제 -

 

난이도 실버 3 문제이다.

자바에서 입력방식은 scanner와 bufferedreader가 있다.

자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

더 자세한 내용은 아래 글 참고 하면 좋다.

https://comain.tistory.com/3

 

(JAVA / 자바) Scanner 와 Bufferedreader

안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

comain.tistory.com

 

풀이 방법

어렵진 않으나 시간이 0.15초이기에 구현에 있어 최소한으로 결과값을 출력해야한다.

최소한으로 하기위해서는 값을 거의 연산만으로 출력해야 할 것이다.

식을 생각해보자.

N이 5이면 12345이기때문에 5자리 숫자이다. N에 1~9까지는 해당 값이 곧 자리수를 의미하는 것이다.

N이 10이상 99이하이면. 10이면 12345678910이다. 11자리이다. 마지막 10을 제외하면 9까지는 9자리. 그리고 10이 추가 되므로써 11자리가 된다. 15이면 123456789101112131415이다. 21자리가된다. 9까지 9자리. 10~ 15까지 총 12자리 숫자이다. 10~ 15까지는 6개의 10 11 12 13 14 15 6개의 수가 있고, 각 두자리씩 갖기 때문에 6 * 2= 12자리 숫자인 것이다. 여기서 패턴이 잡히는 것같다.

N이 32이다. 9까지는 9자리. 10~32까지는 총 23개의 수가 있다. 각 2자리의 수이기에 23 * 2 = 46자리. 9를 합하면 총 55자리 수가 되는 것이다.

100 이상을 보자.

N이 120이다. 9까지는 9자리. 10~120까지 보기전에 두자리 값들은 다 왔다. 10 ~99까지는 다 있는 것이다. 그럼 10~99까지의 개수를 보자. 90이다. *2를 해주면 180이 된다. 9까지의 자리수인 9를 더해주자. 189가 된다. 그렇다면 이 189는 즉 1~ 99까지의 값이 왔을때의 값이 된다. 그렇담 이제 3자리 값들을 보자. 100~ 120이다. 21개의 값이 있다. 3자리씩 갖기 때문에 21 * 3을 해주면 63이 된다. 99까지의 자릿수인 189와 63을 더하자. 252가된다.

확실하게 패턴을 알았을 거다.

네자리 수가 온다면 1~999까지의 값과 네자리 값을 구해서 더해주면 된다.

 

N이 1200일 경우 1~999까지의 합을 down이라 하자. 1200은 네자리이니 네자릿수의 값들을 up이라 하자.

down은 1~9, 10~99, 100~999 까지의 합을 구한다. 

down의 식은 9 * 10의 제곱한 값을 0부터 자릿수 -2인 2까지 해서 더해준다. (주의 할 점은 두자리 값들은 *2, 세자리 값들은 * 3 등을 해주자.)

((9 * 10^0) * 1) + ((9 * 10 ^1) * 2) + ((9 * 10^2) * 3) = 2889

up은 네자릿수의 최솟값인 1000을 1200에 빼주고 +1을 해준다. 1200 - 1000 + 1 = 201. 해줬으면 자릿수를 곱해준다. 201 * 4 = 804

 

마지막은 up과 dow을 합하고 출력해준다. 804 + 2889 = 3693이 된다.

 

코드를 보자.


-풀이-

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		
		//입력값의 자릿수
		int size = String.valueOf(N).length();
		//10의 제곱은 Math.pow를 사용
		int up = (int) (((N - Math.pow(10, (size - 1))) + 1) * size);
		int down = 0;
		for(int i = 0; i < size - 1; i++) {
			down += (9 * Math.pow(10, i)) * (i + 1);
		}
		System.out.println(up + down);
	}

}

-결과-

 


아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.