baru003のブログ

baruの雑記兼備忘録

AOJ 1051

・問題リンク Citation Format

・コメント
今回は一発acceptです(笑)
今回もいつもどおりのゴリ押しです。紙に書いてシミュレーションしてできました。
説明という説明はソースを見ていただければ必要ないと思います。
とにかくもっとテクニックを使ったソースを書けるようになりたいですね・・。
簡潔で読みやすくて無駄がないものを書けるようになりたいです。

・ソース

import java.util.Scanner;

public class P1051 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			if (n == 0)// 終了条件
				break;
			int[] a = new int[n + 1];// 入力値を入れておく箱
			// 数値入力
			for (int i = 0; i < n; i++) {
				a[i] = sc.nextInt();// 箱に入力していく
			}
			// judge
			int[] s = new int[n + 1];// もし連続していたらその地点を入れておく箱
			int[] e = new int[n + 1];// そしてその時の終わりの地点
			int r = 1;
			for (int i = 0; i < a.length; i++) {// 入力値の箱を見ていき連続していたら場所記録
				int cnt = 0;
				for (int j = i + 1; j < a.length; j++) {
					if (a[i] + 1 + cnt == a[j]) {// もし最初の文字と次が一致していたら
						cnt++;// 連続してカウント++
						continue;// その次も確認しにいく
					} else {
						s[r - 1] = a[i];// 連続の開始位置記憶
						e[r - 1] = a[i + cnt];// 連続の終端位置を保存
						r++;// 最後のループ回す回数
						i += cnt;// 連続位置の次から見ていくため
						break;// 連続しなくなったら抜ける
					}
				}
			}
			boolean flag = true;// 最初の一行目にスペース入れないため
			for (int l = 0; l < r - 1; l++) {
				if (flag == false) {
					System.out.print(" ");
				}
				if (s[l] == e[l]) {
					System.out.print(s[l]);
				} else {
					System.out.print(s[l] + "-" + e[l]);
				}
				flag = false;
			}
			System.out.println();
		}
	}
}