Internet Protocol Address [ AIZU ONLINE JUDGE 2889 ]
問題
省略(リンク先参照)
考察
与えられる文字列の長さは最大でも 12 なので、ピリオドの挿入位置の全探索が可能です。
挿入位置が決まると、文字列は 4 つに分割されることになります。
分割後の 4 つの文字列について、それぞれ以下の 2 つの条件を満たしているかどうか検証します。
・0 は「0」のみ認める。00 や 000 などは認められない。
・0 でないなら、先頭が 0 でない(001 のように 0 埋めされているものは認めない)。
このことを検証するには、分割後の実際の文字列と、数値型を経由させた文字列、この 2 つの長さを比べるのが手っ取り早いでしょう。
もし長さが異なるなら、その文字列は 00 や 002 といった構造になっています。
分割後の 4 つの文字列が以上の条件を満たすなら、次に、4 つがそれぞれ 255 以下であるかどうかを検証します。
もし全て 255 以下なら、有効な区切り方として数えます。
コード
static void solve (FastScanner in, PrintWriter out, Methods ms) { String s = in.next(); int length = s.length(); int ans = 0; for (int i=1; i<length-2; i++) { for (int j=i+1; j<length-1; j++) { loop : for (int k=j+1; k<length; k++) { String[] a = {s.substring(0,i), s.substring(i,j), s.substring(j,k), s.substring(k,length)}; for (int x=0; x<4; x++) { if (a[x].length() != String.valueOf(Integer.parseInt(a[x])).length()) { continue loop; } } if (Integer.parseInt(a[0]) <= 255 && Integer.parseInt(a[1]) <= 255 && Integer.parseInt(a[2]) <= 255 && Integer.parseInt(a[3]) <= 255) { ans++; } } } } out.println(ans); }
breakでループ階層の指定ができることは知っていましたが、continueでも同様のことができるとは知りませんでした。