AOJ 2583: JAG-channel テキスト整形

問題

JAG-channel | Aizu Online Judge

hoge
.fuga
..foobar
..jagjag
...zigzag
.piyo

というテキストを読み込んで、

hoge
+fuga
|+foobar
|+jagjag
| +zigzag
+piyo

というツリー形式に書き換える。

解法

各行について、読み込んでからはひとまず英文字列の直前の'.'のみを'+'に置換しておき、残りはスペースにしておく。この時点での変換結果は下の通りになる。

hoge
+fuga
 +foobar
 +jagjag
  +zigzag
+piyo

次に、'+'の上にあるスペースを他の文字に当たるまで'|'に置き換える。終わり。

解答コード

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            int data = scanner.nextInt();
            if (data == 0) {
                scanner.close();
                break;
            }

            char[][] symbols = new char[data][];
            symbols[0] = scanner.next().toCharArray();

            for (int i = 1; i < data; i++) {
                symbols[i] = scanner.next().toCharArray();
                for (int j = 0; j < symbols[i].length; j++) {
                    if (symbols[i][j + 1] != '.') {
                        // 右隣が文字の'.'は必ず'+'である
                        symbols[i][j] = '+';
                        for (int k = i - 1; k >= 0; k--) {
                            // '+'の上にあるスペースは'|'で埋めていく
                            if (symbols[k][j] == ' ') {
                                symbols[k][j] = '|';
                            } else {
                                break;
                            }
                        }
                        break;
                    } else {
                        // それ以外ならとりあえずスペースで埋めておく
                        symbols[i][j] = ' ';
                    }
                }
            }

            for (int i = 0; i < symbols.length; i++) {
                System.out.println(symbols[i]);
            }

        }

    }
}