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(); } } }