[백준] 1790.수 이어 쓰기 2 (Swift)
https://www.acmicpc.net/problem/1790
풀이
입력값의 최대 크기가 1억이기 때문에 단순히 문자열을 이어붙여서 탐색하는 방법으로는 문제를 해결할 수 없습니다.
그래서 규칙을 찾아야 하는데, 이 문제에서 찾을 수 있는 규칙은 다음과 같습니다.
1자리 숫자 1~9 는 총 9개가 존재합니다.
2자리 숫자 10~99 는 총 90개가 존재합니다.
3자리 숫자 100~999 는 총 900개가 존재합니다.
4자리 숫자 1000~9999 는 총 9000개가 존재합니다.
위처럼 따라가다 보면 n 자리 숫자는 총 9 * 10^n 개가 존재한다는 것을 확인할 수 있습니다.
하지만 저희가 구하는 것은 숫자의 개수가 아닌 숫자에 포함된 문자의 개수입니다.
n 자리 숫자는 모두 n 자리로 이루어져 있기 때문에, 존재하는 숫자의 개수에 자릿수를 곱해주면 해당 범위에 몇개의 문자가 포함되는지 알 수 있습니다. 이는 9 * 10^n * n 으로 나타낼 수 있습니다.
그렇다면 1자리는 9개, 2자리는 90 * 2 개, 3자리는 900 * 3 개... 의 문자를 가지고 있다는 것을 알 수 있습니다.
주어진 숫자 K 가 몇번째 문자인지 찾기 위해서는 K 가 몇자리 수인지 알아야 합니다. 그리고 그보다 작은 자릿수의 경우를 모두 빼주면 범위는 확 줄어듭니다.
예를 들어 K 가 200 이라는 3자리 수라면, 1자리수 9개, 2자리수 90 * 2 개를 제외해 200 - ( 9 + 180) = 11 이라는 숫자가 나온다는 것을 알 수 있습니다.
이는 K 가 3자리수의 시작인 100 으로부터 11 번째 문자를 가리킨다는 것입니다.
여기서 도출한 숫자를 원래 자릿수로 나눠줍니다. 11 의 경우 3 으로 나눠주면 3 이라는 값이 나오고, 나머지는 2 가 됩니다.
이는 100 보다 3만큼 큰 숫자인 103의 2번째 자릿수를 의미합니다. 그래서 정답은 0이 됩니다.
여기서 도출해낸 103 이라는 숫자가 첫번째 입력값인 N 보다 크다면 -1 를 출력해주면 됩니다.
코드
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 5639.이진 검색 트리 (Swift) (0) | 2022.05.24 |
---|---|
[백준] 1655.가운데를 말해요 (Swift) (0) | 2022.05.24 |
[백준] 2467.용액 (Swift) (0) | 2022.05.23 |
[백준] 1484.다이어트 (Swift) (0) | 2022.05.22 |
[백준] 5014.스타트링크 (Swift) (0) | 2022.05.22 |