まふ雑記

気になったこと、共有したいことをなんでも書きます。

AtCoder ABC 143 C - Slimes を解いた

どうも、まふゆです。

AtCoder ABC 143」 が終了しました。

CのSlimesまで解けたので、解説します。

C-Slimes概要

スライムがN匹並んでいます。

隣り合うスライムが同じ色であれば、融合して1匹になります。

最終的に何匹のスライムが残っているでしょう。という問題。

色は長さNの英小文字で、たとえば1番目のスライムは1文字目の英小文字の色になる。

考え方

隣り合う英小文字が同じであれば消して、最終的に残った英小文字の数を求める問題です。

色が
aabbbbaaca
となっているとき、

abaca
となります。

この場合の答えは「5」です。

[]で囲った箇所が消えます。
a[a]b[bbb]a[a]ca

このように、隣り合う文字列の重複を排除して残った文字列の長さを求めるとき、

全体の文字列の長さ - 消した文字数 = 残った文字列の長さ

という考え方をします。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var slimes int
    fmt.Scanf("%d", &slimes)
    var color string
    fmt.Scanf("%s", &color)

    strColor := strings.Split(color, "")

    str := "" // 隣の文字
    counter := 0
    for i := 0; i < slimes; i++ {
        if str != strColor[i] {
            str = strColor[i]
            continue
        }
        counter++
    }

    fmt.Printf("%d", (slimes - counter))
}

もっといい解き方あると思う。