文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

Internet Protocol Address [ AIZU ONLINE JUDGE 2889 ]

judge.u-aizu.ac.jp


問題

省略(リンク先参照)


考察

与えられる文字列の長さは最大でも 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でも同様のことができるとは知りませんでした。