console.log

[BOJ] 1790 수 이어 쓰기 2 JAVA 본문

알고리즘/백준

[BOJ] 1790 수 이어 쓰기 2 JAVA

foresight 2023. 9. 15. 20:18

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

 

1790번: 수 이어 쓰기 2

첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.

www.acmicpc.net

 

메모리 : 12868 kb

실행시간 : 112 ms

 

문제분석

문제대로 수를 쭉 나열해서 인덱스를 뽑아오면 메모리초과, 시간초과가 날 것이 분명한 문제 ..
규칙을 찾아야 한다

 

걸린시간

2시간 ⏱️

 

풀이방법

1 자리 : 1 ~ 9 (1 - 9개) + 9개
2 자리 : 10 ~ 99 (10 - 189개) + 180개
3 자리 : 100 ~ 999 (190 - 2889개) + 2700개
4 자리 : 1000 ~ 9999 (2900 - 38889개) + 3600개

위 규칙을 활용해서

1. k가 포함된 자리 수를 찾은 뒤
	- 자리 수마다 9 * i * Math.pow(10, i - 1) 개씩 늘어난다는 점을 활용해 k의 자리 수 구하기
2. 몫과 나머지를 이용해 k가 위치하는 수와
	- k에서 이전 자리 수 개수만큼 빼준다. (k가 3자리 수라면 k - 189)
	- k가 포함된 수를 구한다 ((k - 1)/ 자리 수) + Math.pow(10, (자리 수 - 1)) // k에서 1을 빼주고 자리 수
		로 나눠줘야 함
	- 만약 이 수가 N보다 클 경우 -1 출력
3. 실제 k번째 수를 찾아가는 과정이 필요하다
	- k번째 수 계산을 위해서는 해당 자리 수 첫 번째 부터 떨어진 거리를 알아야 하기 때문에 k-1 해준다 (3자리 수는 190부터 시작인데 2번에서 189를 빼줬기 때문에 -1 더 해주는 것)
	- k가 포함된 수에서 k를 i로 나눈 나머지 위치의 수를 뽑아낸다.

 

포인트

규칙찾기 🧩

 

코드

/*
1 자리 : 1 ~ 9 		(1 - 9개) + 9개
2 자리 : 10 ~ 99 		(10 - 189개) + 180개
3 자리 : 100 ~ 999		(190 - 2889개) + 2700개
4 자리 : 1000 ~ 9999	(2900 - 38889개) + 3600개
*/
package study.day0811;

import java.io.IOException;
import java.util.Scanner;

public class BOJ_1790_수이어쓰기2 {	// 메모리 : 12868kb	실행시간 : 112ms
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		long N = sc.nextInt();
		long k = sc.nextInt();
		long i = 2;
		long endPrev = 9;

		if(k < 10) {	// 만약 k가 1자리 수라면
			if(k <= N) System.out.println(k);	// k가 범위내에 있을 경우 k출력
			else System.out.println(-1);	// 범위 밖이면 -1 출력
			return;
		}
		while(true) {	// N이 몇 자리 수인지 파악하기
			endPrev += 9 * i * Math.pow(10, i - 1);
			if(k <= endPrev) {				
				endPrev -= 9 * i * Math.pow(10, i - 1);
				break;
			}
			i++;
		}

		k -= endPrev;
		long nowNum = (int) (((k - 1)/ i) + Math.pow(10, (i - 1)));	// k가 포함된 수 구하기
		k--;	// 자리수 계산을 위해서는 i자리 수 첫번 째 부터의 거리를 알아야 하기 때문에 -1 해준다

		if(nowNum > N) System.out.println(-1);	// k가 포함된 수가 N보다 크면 -1 출력
		else {
			System.out.println(String.valueOf(nowNum).charAt((int) (k % i)));	// k % i 번째 인덱스 출력
		}

	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 16637 괄호 추가하기 JAVA  (0) 2023.10.01
[BOJ] 14891 톱니바퀴 JAVA  (0) 2023.09.25
[BOJ] 1759 암호 만들기 JAVA  (0) 2023.09.24
[BOJ] 12904 A와 B JAVA  (0) 2023.09.19
[BOJ] 2800 괄호 제거 JAVA  (0) 2023.08.31