1. HackerRank Repeated String
There is a string, , of lowercase English letters that is repeated infinitely many times. Given an integer, , find and print the number of letter a’s in the first letters of the infinite string.
Example
The substring we consider is , the first characters of the infinite string. There are occurrences of a in the substring.
Function Description
Complete the repeatedString function in the editor below.
repeatedString has the following parameter(s):
s: a string to repeat
n: the number of characters to consider
Returns
int: the frequency of a in the substring
Input Format
The first line contains a single string, .
The second line contains an integer, .
Constraints
For of the test cases, .
Sample Input
Sample Input 0
aba
10
Sample Output 0
7
Explanation 0
The first letters of the infinite string are abaabaabaa. Because there are a’s, we return .
Sample Input 1
a
1000000000000
Sample Output 1
1000000000000
Explanation 1
Because all of the first letters of the infinite string are a, we return .
1.1. 컴퓨팅적 사고
해당 문제는 주어진 문자열 s의 문자의 반복을 통해 n의 범위까지의 문자열을 만들고 그 중 'a’의 개수를 리턴해주는 문제입니다.
처음에 정규표현식으로 접근하였다가 올바르지 않는 솔루션인것 같아 최대 문자열의 개수를 이용하여 문제를 해결하였습니다.
문자열의 최대는 n까지이므로 n / s의 길이를 해주게 되면 s의 문자열이 몇 번 반복되는지 알 수 있습니다. 그리고 n % s로 나눈 나머지는 최대나오는 횟수를 제외한 나머지 문자열을 구할 수 있습니다.
예를 들어, s가 ‘aba’ n = 10이 주어졌다고 가정하면 s로 만들수 있는 최대의 문자열은 다음과 같습니다.
abaabaabaa
총 길이가 10이 되는 문자열이 되고, abcac로 만들 수 있는 최대 횟수는 3회가 됩니다. 그리고 최대횟수를 제외한 나머지는 a문자열 하나 즉 1개가 남게 됩니다.
- 문제풀이를 진행해보면 맨처음에 s라는 문자열에 'a’라는 문자열이 존재하지 않으면 더이상 솔루션을 진행할 필요가 없기 때문에 0을 리턴해주었습니다.
- 만약에 n의 범위보다 s의 길이가 크다면 n의 범위를 제외한 나머지범위중에서 'a’의 개수를 카운팅 시켜줍니다.
- 만약에 n의 범위보다 s의 길이가 작다면 s로 만들수 있는 최대의 횟수 + s의 나머지의 횟수를 구해줍니다.
즉, ‘abaabaaba’ 길이 9 s로 만들 수 있는 최대의 횟수 3(최대 나누어진 개수) * 2(a의 개수) 와abaabaaba
를 제외하면 나머지는 1만큼만 채울 수 있기 때문에 'a’를 그 이후에 붙여나갈 수 있습니다. 따라서 나머지 a의 개수 1 을 더해주게 되면 (3 * 2 + 1) 즉, 7의 값을 도출해낼 수 있습니다. - n의 범위는 n^12이므로 1000000000000 long의 범위에 주의하여 처리하면 쉽게 구할 수 있습니다.
1.2. 소스코드
1 | import java.io.*; |