AtCoderのAGC039-A(300点)

AGC039-Aへのリンク

場合分けが適切に行えず、WAを連発。
漏れのあったケースに合わせてif文をたてるものの、結局解決せず。。
Editorialを見て、やっとAC。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        String s = sc.next();
        char[] c = s.toCharArray();

        long k = sc.nextLong();

        long ans = 0;

        int cnt = 1;
        for (int i=0; i<s.length()-1; i++){
            if (c[i]==c[i+1]) {
                cnt++;
            }
        }

        if (cnt==s.length()){
            System.out.println(((long)s.length()*k)/2);
        }else {
            if (c[0]==c[s.length()-1]){
                String t = s+s;

                char[] cc = t.toCharArray();
                long tmp = 0;
                for (int j=0; j<t.length()-1; j++){
                    if (cc[j]==cc[j+1]){
                        tmp++;
                        j++;
                    }
                }
                for (int j=0; j<s.length()-1; j++){
                    if (c[j]==c[j+1]){
                        ans++;
                        j++;
                    }
                }

                if (tmp == ans*2){
                    System.out.println(ans*k);
                }else {
                    System.out.println(ans+(ans+1)*(k-1));
                }

            }else {
                for (int i=0; i<s.length()-1; i++){
                    if (c[i]==c[i+1]){
                        ans++;
                        i++;
                    }
                }
                System.out.println(ans*k);
            }
        }
    }
}
結局、必要だった場合分けは、
  1. if 文字列が全て同じ文字
  2. else if 文字列の両端が同じ文字
  3. else 残りの場合(両端が異なる)
両端が同じ場合はさらに以下のように分けられる
  1. 2つ目の文字列を繋げた時に、indexが0のものを変更することで、単純にcount*k回とはならないもの。
  2. count*k回となるもの。
まとめ

場合分けの試行は手を動かしてしてみたものの、より複雑な場合分けになってしまって、最後の1~2個のWAが解決しなかった。
1つ1つの場合に合わせて、if文をたてるという苦肉の策に出ないように、ちゃんと法則を見つけて整理した上で、場合分けしなければなと。