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