From eae06a7edbf2cd3809be26701f137c89626f1c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=A4=92=20=E8=80=80=E5=B9=B3?= Date: Tue, 16 Aug 2022 11:47:18 +0900 Subject: [PATCH 1/2] =?UTF-8?q?A053=20RGB=E3=81=AE=E5=80=8B=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ykoiso/src/A053_RGB.java | 101 ++++++++++++++++++++++++++ ykoiso/test/A053_RGBTest.java | 130 ++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 ykoiso/src/A053_RGB.java create mode 100644 ykoiso/test/A053_RGBTest.java diff --git a/ykoiso/src/A053_RGB.java b/ykoiso/src/A053_RGB.java new file mode 100644 index 0000000..100d77c --- /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 getByStr(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]; + boolean[][] isCheck = new boolean[height][width]; + // スプリットして格納 + for (int i = 0; i < height; i++) { + String str = scan.next(); + map[i] = str.split(""); + } + // それぞれの色で塗った回数のカウント + COLOR color; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + // 指定した場所が未探索かの確認 + // 未探索なら色をカウントし隣接マスを探索 + if (isCheck[i][j] == false) { + color = COLOR.getByStr(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) { + //高さと幅を取得 + int height = map.length; + int width = map[0].length; + //探索済みなら探索終了 + if (isCheck[h][w] == true) { + return; + } + //対象マスを探索済みに + isCheck[h][w] = true; + //隣接マスの色を確認、同じなら再帰的に探索 + 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 0000000..b73056b --- /dev/null +++ b/ykoiso/test/A053_RGBTest.java @@ -0,0 +1,130 @@ +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)); + } +} -- GitLab From a2aac5fcfdbf24759c1d80b756b82bd3217476a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=A4=92=20=E8=80=80=E5=B9=B3?= Date: Tue, 16 Aug 2022 15:41:07 +0900 Subject: [PATCH 2/2] =?UTF-8?q?A053=20RGB=E3=81=AE=E5=80=8B=E6=95=B0?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ykoiso/src/A053_RGB.java | 12 +-- ykoiso/test/A053_RGBTest.java | 143 ++++++++++++++++++---------------- 2 files changed, 80 insertions(+), 75 deletions(-) diff --git a/ykoiso/src/A053_RGB.java b/ykoiso/src/A053_RGB.java index 100d77c..d37d197 100644 --- a/ykoiso/src/A053_RGB.java +++ b/ykoiso/src/A053_RGB.java @@ -24,7 +24,7 @@ public class A053_RGB { count++; } - public static COLOR getByStr(String str) { + public static COLOR getColor(String str) { for (COLOR color : COLOR.values()) { if (color.getStr().equals(str)) { return color; @@ -40,20 +40,20 @@ public class A053_RGB { final int width = scan.nextInt(); final String[][] map = new String[height][width]; - boolean[][] isCheck = new boolean[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.getByStr(map[i][j]); + color = COLOR.getColor(map[i][j]); color.incrementCount(); checkAdjacent(i, j, map, isCheck); } @@ -67,15 +67,15 @@ public class A053_RGB { // 同じ色で塗られている隣接マスを探索する public static void checkAdjacent(final int h,final int w,final String[][] map, boolean[][] isCheck) { - //高さと幅を取得 - int height = map.length; - int width = map[0].length; //探索済みなら探索終了 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])) { diff --git a/ykoiso/test/A053_RGBTest.java b/ykoiso/test/A053_RGBTest.java index b73056b..e5e7fd1 100644 --- a/ykoiso/test/A053_RGBTest.java +++ b/ykoiso/test/A053_RGBTest.java @@ -3,127 +3,132 @@ 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; + 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"}, + 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}, + {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"}, + 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}, + {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"}, + 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}, + {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"}, + 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 }, + {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"}, + 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}, + {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"}, + 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}, + {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)); } -- GitLab