문제
$3$의 배수일때는 Fizz, $5$의 배수일때는 Buzz, 둘 모두의 배수일때는 FizzBuzz, 그 외에는 수 자신을 나열해서 얻은 문자열을 FizzBuzz String이라 합시다. 이는 아래와 같이 나타납니다.
12Fizz4BuzzFizz78…
위와 같은 FizzBuzz String에서 $s$번째 문자부터 $20$개의 문자를 출력하는 문제입니다.
풀이
우리는 $s$번째 문자가 포함된 수를 찾고 싶습니다.
이 수를 $n$이라 합시다.
$i$부터 $j$까지 FizzBuzz String에서 차지하는 문자의 개수를 계산하려고 할 때, $i$부터 $j$까지 자릿수가 일치하면 쉽게 계산할 수 있습니다.
자릿수를 $k$라 하면 $k(j - i + 1)$에서 $3$의 배수의 개수만큼 $(4 - k)$를 더하고, $5$의 배수의 개수만큼 $(4 - k)$를 더한 다음 $15$의 배수의 개수만큼 $k$를 더해주면 됩니다.
따라서 먼저 $n$의 자릿수를 구해 줍시다.
모든 한 자리 수가 FizzBuzz String에서 차지하는 문자의 개수의 합이 $s$보다 작다면 이를 $s$에서 뺍니다.
모든 두 자리 수가 FizzBuzz Stirng에서 차지하는 문자의 개수의 합이 $s$보다 작다면 또 이를 $s$에서 뺍니다.
모든 $k$자리 수가 FizzBuzz String에서 차지하는 문자의 개수의 합이 $s$보다 크거나 같을 때 까지 이를 반복합니다.
그렇게 찾은 $n$의 자릿수는 $k$가 됩니다.
이제 같은 계산법으로 이분 탐색을 통해서 $n$을 찾으면 됩니다.
코드
1 | |