Skip to content

Commit 354e68d

Browse files
committed
[hackerrank] Special String Again
1 parent 0fb6ef0 commit 354e68d

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package hackerrank.string
2+
3+
import kotlin.math.min
4+
5+
fun substrCount(n: Int, s: String): Long {
6+
7+
var count = n.toLong()
8+
val serial = arrayOfNulls<Char>(n)
9+
var last = -1
10+
11+
s.forEachIndexed { idx, char ->
12+
if (last >= 0 && serial[last] != char) {
13+
count += countComposition(last + 1)
14+
count += countMidException(idx, last, s, serial[last]!!)
15+
last = -1
16+
}
17+
18+
serial[++last] = char
19+
if (idx == s.length - 1)
20+
count += countComposition(last + 1)
21+
}
22+
23+
return count
24+
}
25+
26+
private fun countMidException(
27+
idx: Int,
28+
last: Int,
29+
s: String, // 최초에 주어진 s
30+
char: Char
31+
): Int {
32+
33+
var count = 0
34+
val startIdx = idx + 1
35+
if (startIdx >= s.length) return 0
36+
val endIdx = min(idx + last + 1, s.length - 1)
37+
38+
(startIdx..endIdx).forEach {
39+
if (s[it] == char) count++
40+
else return count
41+
}
42+
43+
return count
44+
}
45+
46+
/**
47+
* a -> 0
48+
* aa -> 1
49+
* aaa -> 2 + 1
50+
* aaaa -> 3 + 2 + 1
51+
* ...
52+
* a가 n개 -> n(n - 1) / 2
53+
*/
54+
fun countComposition(elementCount: Int): Long = elementCount.toLong().let { it * (it - 1) / 2 }
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package hackerrank.string
2+
3+
import org.junit.Assert.assertEquals
4+
import org.junit.Test
5+
6+
class SpecialStringAgainKtTest {
7+
8+
@Test
9+
fun `substrCount 모든 글자가 같은 경우를 고려해야 한다`() {
10+
assertEquals(1, substrCount(1, "a"))
11+
assertEquals(2, substrCount(2, "ab"))
12+
assertEquals(2 + 1, substrCount(2, "aa"))
13+
assertEquals(3 + 1, substrCount(3, "aab"))
14+
assertEquals(3 + 3, substrCount(3, "aaa")) // (n - 1) + ... 1
15+
}
16+
17+
@Test
18+
fun `substrCount 가운데 글자를 제외한 모든 글자가 같은 경우도 고려해야 한다`() {
19+
assertEquals(3 + 1, substrCount(3, "aba"))
20+
assertEquals(4 + 1 + 1, substrCount(4, "abab"))
21+
assertEquals(5 + 3 + 1, substrCount(5, "aaaba"))
22+
assertEquals(6 + 3 + 1 + 2, substrCount(6, "aaabaa"))
23+
assertEquals(7 + 3 + 3 + 3, substrCount(7, "aaabaaa"))
24+
}
25+
26+
@Test
27+
fun substrCount() {
28+
assertEquals(1, substrCount(1, "a"))
29+
assertEquals(2, substrCount(2, "ab"))
30+
assertEquals(3, substrCount(2, "aa"))
31+
assertEquals(4, substrCount(3, "aba"))
32+
assertEquals(4, substrCount(3, "aab"))
33+
assertEquals(4, substrCount(3, "abb"))
34+
assertEquals(6, substrCount(3, "aaa"))
35+
assertEquals(7, substrCount(5, "asasd"))
36+
assertEquals(10, substrCount(7, "abcbaba"))
37+
assertEquals(10, substrCount(4, "aaaa"))
38+
}
39+
40+
}

0 commit comments

Comments
 (0)