AtCoderのAGC039-A(300点)
場合分けが適切に行えず、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); } } } }
結局、必要だった場合分けは、
- if 文字列が全て同じ文字
- else if 文字列の両端が同じ文字
- else 残りの場合(両端が異なる)
両端が同じ場合はさらに以下のように分けられる
- 2つ目の文字列を繋げた時に、indexが0のものを変更することで、単純にcount*k回とはならないもの。
- count*k回となるもの。
まとめ
場合分けの試行は手を動かしてしてみたものの、より複雑な場合分けになってしまって、最後の1~2個のWAが解決しなかった。
1つ1つの場合に合わせて、if文をたてるという苦肉の策に出ないように、ちゃんと法則を見つけて整理した上で、場合分けしなければなと。