diff --git a/ykoiso/src/A053_RGB.java b/ykoiso/src/A053_RGB.java new file mode 100644 index 0000000000000000000000000000000000000000..d37d197fef18cf70232bccafaed3bb46aed1de31 --- /dev/null +++ b/ykoiso/src/A053_RGB.java @@ -0,0 +1,101 @@ +import java.util.Scanner; + +public class A053_RGB { + // 各色を表すenum + enum COLOR { + RED("R"), BLUE("B"), GREEN("G"); + + final private String str; + private int count = 0; + + COLOR(String str) { + this.str = str; + } + + public String getStr() { + return str; + } + + public int getCount() { + return count; + } + + public void incrementCount() { + count++; + } + + public static COLOR getColor(String str) { + for (COLOR color : COLOR.values()) { + if (color.getStr().equals(str)) { + return color; + } + } + return null; + } + } + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + final int height = scan.nextInt(); + final int width = scan.nextInt(); + + final String[][] map = new String[height][width]; + // スプリットして格納 + for (int i = 0; i < height; i++) { + String str = scan.next(); + map[i] = str.split(""); + } + // それぞれの色で塗った回数のカウント + final boolean[][] isCheck = new boolean[height][width]; + COLOR color; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + // 指定した場所が未探索かの確認 + // 未探索なら色をカウントし隣接マスを探索 + if (isCheck[i][j] == false) { + color = COLOR.getColor(map[i][j]); + color.incrementCount(); + checkAdjacent(i, j, map, isCheck); + } + } + } + // 結果の出力 + System.out.println( + COLOR.RED.getCount() + " " + COLOR.GREEN.getCount() + " " + COLOR.BLUE.getCount()); + scan.close(); + } + + // 同じ色で塗られている隣接マスを探索する + public static void checkAdjacent(final int h,final int w,final String[][] map, boolean[][] isCheck) { + //探索済みなら探索終了 + if (isCheck[h][w] == true) { + return; + } + //対象マスを探索済みに + isCheck[h][w] = true; + //高さと幅を取得 + final int height = map.length; + final int width = map[0].length; + //隣接マスの色を確認、同じなら再帰的に探索 + if (w < width - 1) { + if (map[h][w].equals(map[h][w + 1])) { + checkAdjacent(h, w + 1, map, isCheck); + } + } + if (0 < w) { + if (map[h][w].equals(map[h][w - 1])) { + checkAdjacent(h, w - 1, map, isCheck); + } + } + if (h < height - 1) { + if (map[h][w].equals(map[h + 1][w])) { + checkAdjacent(h + 1, w, map, isCheck); + } + } + if (0 < h) { + if (map[h][w].equals(map[h - 1][w])) { + checkAdjacent(h - 1, w, map, isCheck); + } + } + } +} diff --git a/ykoiso/test/A053_RGBTest.java b/ykoiso/test/A053_RGBTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e5e7fd1c756c8a97d258f66e813a90647f976f5f --- /dev/null +++ b/ykoiso/test/A053_RGBTest.java @@ -0,0 +1,135 @@ +import static org.junit.Assert.assertThat; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.*; + +public class A053_RGBTest { + boolean[][] isCheck = new boolean[5][5]; + final int H = 5; + final int W = 5; + + @Test + public void 上下右左の方向に対して隣接した赤マスを判断できる() { + final String[][] map = { + {"G", "B", "G", "G", "G"}, + {"G", "B", "R", "G", "G"}, + {"G", "R", "R", "R", "G"}, + {"G", "G", "R", "B", "G"}, + {"G", "G", "G", "B", "G"} + }; + A053_RGB.checkAdjacent(2, 2, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {false, false, false, false, false}, + {false, false, true , false, false}, + {false, true , true , true , false}, + {false, false, true , false, false}, + {false, false, false, false, false} + }; + assertThat(actual, is(expected)); + } + + @Test + public void 隣接したマスがない場合対象座標のみ判断する() { + final String[][] map = { + {"G", "B", "G", "G", "G"}, + {"G", "B", "B", "G", "G"}, + {"G", "G", "R", "B", "G"}, + {"G", "G", "G", "B", "G"}, + {"G", "G", "G", "B", "G"} + }; + A053_RGB.checkAdjacent(2, 2, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, true , false, false}, + {false, false, false, false, false}, + {false, false, false, false, false} + }; + assertThat(actual, is(expected)); + } + + @Test + public void 斜めの位置や1つ飛ばしは隣接と判断しない() { + final String[][] map = { + {"G", "B", "R", "G", "G"}, + {"R", "B", "B", "R", "G"}, + {"G", "R", "R", "B", "G"}, + {"R", "G", "G", "R", "G"}, + {"G", "G", "R", "B", "G"} + }; + A053_RGB.checkAdjacent(2, 2, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, true , true , false, false}, + {false, false, false, false, false}, + {false, false, false, false, false} + }; + assertThat(actual, is(expected)); + } + + @Test + public void 隣接した赤マスなら2つ以上連続したものでも判断できる() { + final String[][] map = { + {"R", "B", "R", "G", "G"}, + {"R", "B", "R", "G", "G"}, + {"R", "R", "R", "R", "R"}, + {"G", "G", "R", "B", "R"}, + {"G", "G", "G", "R", "R"} + }; + A053_RGB.checkAdjacent(3, 2, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {true , false, true , false, false}, + {true , false, true , false, false}, + {true , true , true , true , true }, + {false, false, true , false, true }, + {false, false, false, true , true } + }; + assertThat(actual, is(expected)); + } + + @Test + public void 青マスの隣接を判断できる() { + final String[][] map = { + {"G", "B", "G", "G", "G"}, + {"G", "B", "R", "G", "G"}, + {"G", "R", "R", "R", "G"}, + {"G", "G", "B", "B", "G"}, + {"G", "G", "G", "B", "G"}, + }; + A053_RGB.checkAdjacent(3, 2, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, true , true , false}, + {false, false, false, true , false} + }; + assertThat(actual, is(expected)); + } + + @Test + public void 緑マスの隣接を判断できる() { + final String[][] map = { + {"G", "B", "G", "G", "G"}, + {"G", "B", "R", "G", "G"}, + {"G", "R", "R", "R", "G"}, + {"G", "G", "B", "B", "G"}, + {"G", "G", "G", "B", "G"} + }; + A053_RGB.checkAdjacent(0, 0, map, isCheck); + final boolean[][] actual = isCheck; + final boolean[][] expected = { + {true , false, false, false, false}, + {true , false, false, false, false}, + {true , false, false, false, false}, + {true , true , false, false, false}, + {true , true , true , false, false} + }; + assertThat(actual, is(expected)); + } +}