업데이트:

최대 1 분 소요

문제

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

boj1790

풀이

입력이 N기준 최대 1억임에도 불구하고 시간 제한은 7초이다.
1부터 1억까지 이어쓰기에 시간이 부족하기에 다른 방법을 생각했다.

먼저 k가 1~9의 범위 안에 있다면 자리수는 한자리이다. k가 10~99의 범위 안에 있다면 자리수는 두자리이다.
위와 같이 k에서 자리수에 자리수를 늘려가며 맞게끔 9x1, 90x2, 900x3, … 을 빼준다.
이유는 1~9 는 각 숫자마다 1자리씩이지만 10~99부터는 각 숫자마다 2자리 이상이기 때문이다.

그렇게 k에서 자리수에 맞게 빼주다보면 더 이상 뺄 수 없는 값이 나온다.
이 때 k가 어느 수에 속하는지 알기 위해 k를 지금까지 세어온 자리수 만큼으로 나눈 뒤
그 값을 더해준다. (k가 300인 경우 그 자리수인 3으로 나눠주면 원하는 값이 100이 나온다.) k 로 원하는 수를 찾았으면 n과 대소비교를 한 뒤 값을 내면 된다.

n, k = map(int, input().split())
ans = 0
digit = 1
nine = 9


while k > digit*nine:
    k = k-(digit * nine)
    ans = ans + nine
    digit+=1
    nine = nine*10

ans = (ans+1) + (k-1) // digit

if ans > n:
    print(-1)
else:
    print(str(ans)[(k-1)%digit])

생각 & 정리

10~99, 100~999 … 사이의 값이 90개가 아니라 89개라고 생각해서 한참 해멨다.

댓글남기기