ランレングス圧縮のサンプル

2022/10/21に公開

B - 高橋くんと文字列圧縮
https://atcoder.jp/contests/abc019/tasks/abc019_2

ランレングス圧縮はライブラリとして持っていたほうがいい気がしましたが、競プロ用のライブラリを管理する仕組みを何も構築していないです。
とりあえずZennに投稿してお茶を濁します。

上記問題がランレングス圧縮をするだけの問題だったのでその提出コードを貼っておきます。

fun main() {
    val s = readLine()!!
    val rle = rle(s)
    println(rleJoin(rle))
}

fun rleJoin(list: List<Pair<Char, Int>>): String {
    return list.joinToString("") { "" + it.first + it.second }
}

fun rle(s: String): List<Pair<Char, Int>> {
    val ret = mutableListOf<Pair<Char, Int>>()

    var c = s[0]
    var count = 1

    if(s.length == 1) {
        ret.add(c to count)
    }

    for(i in 1 until s.length) {
        if(c == s[i]) {
            count++
        } else {
            ret.add(c to count)
            c = s[i]
            count = 1
        }

        if(i == s.length - 1) {
            ret.add(c to count)
        }
    }
    return ret
}

Discussion