From bed6d2f4f0db3217f14186d12b85032e337e3649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Fri, 2 Aug 2024 17:28:38 +0900 Subject: [PATCH 01/12] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 154 ++++++++++++++++++++++++++++++ sitou/src/Adventurer.java | 15 +++ sitou/src/InputData.java | 16 ++++ sitou/src/Parallel.java | 21 ++++ sitou/src/Result.java | 13 +++ sitou/src/TreasureMap.java | 26 +++++ sitou/test/A083_Test.java | 37 +++++++ sitou/test/TreasureMapTest.java | 73 ++++++++++++++ 8 files changed, 355 insertions(+) create mode 100644 sitou/src/A083_SecretMessage.java create mode 100644 sitou/src/Adventurer.java create mode 100644 sitou/src/InputData.java create mode 100644 sitou/src/Parallel.java create mode 100644 sitou/src/Result.java create mode 100644 sitou/src/TreasureMap.java create mode 100644 sitou/test/A083_Test.java create mode 100644 sitou/test/TreasureMapTest.java diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java new file mode 100644 index 0000000..5eb1009 --- /dev/null +++ b/sitou/src/A083_SecretMessage.java @@ -0,0 +1,154 @@ +package src; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.Scanner; + +public class A083_SecretMessage { + + public static void main(String[] args) { + execute(); + } + + static void execute() { + final InputData inputData = input(); + final TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = solve(treasureMap); + output(result); + } + + private static InputData input() { + final Scanner scan = new Scanner(System.in); + final int height = scan.nextInt(); + final int width = scan.nextInt(); + final List mapStatus = new ArrayList(); + + for (int i = 0; i < height; i++) { + mapStatus.add(scan.next()); + } + + scan.close(); + return new InputData(height, width, mapStatus); + + } + + public static Result solve(TreasureMap treasureMap) { + + String result = treasureMap.world.get(0).get(0); + final List resultList = new ArrayList(); + + // 初期値格納 + final Parallel first_time = new Parallel(0, 0, treasureMap.world, result); + final Queue queue = new ArrayDeque<>(); + queue.add(first_time); + + while (true) { + // キューからデータを受け取る + final Parallel parallel = queue.poll(); + + final int nowX = parallel.point.x; + final int nowY = parallel.point.y; + result = parallel.p_result; + + // 世界はディープコピーする + List> now_world = new ArrayList>(); + for (int i = 0; i < treasureMap.height; i++) { + List list = (List) ((ArrayList) parallel.world.get(i)).clone(); + now_world.add(list); + } + + // 今いる場所を次に来れないようにする + now_world.get(nowY).set(nowX, "zzz"); + Adventurer ad = new Adventurer(nowX, nowY); + + // 4方向の文字を確認していく + String sinmoji = "zz"; + int nextX = nowX; + int nextY = nowY; + if ((ad.point.x) + 1 < treasureMap.width && sinmoji + .compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) >= 0) { + if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel((ad.point.x) + 1, ad.point.y, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get(ad.point.y).get(ad.point.x + 1); + nextX = (ad.point.x) + 1; + nextY = ad.point.y; + } + } + if ((ad.point.y) + 1 < treasureMap.height && sinmoji + .compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) >= 0) { + if (sinmoji.compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) + 1, now_world, + p_result); + queue.add(newParallel); + + } else { + sinmoji = now_world.get((ad.point.y) + 1).get(ad.point.x); + nextX = ad.point.x; + nextY = (ad.point.y) + 1; + } + } + if (ad.point.x > 0 && sinmoji + .compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) >= 0) { + if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel((ad.point.x) - 1, ad.point.y, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get(ad.point.y).get((ad.point.x) - 1); + nextX = (ad.point.x) - 1; + nextY = ad.point.y; + } + } + if (ad.point.y > 0 && sinmoji + .compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) >= 0) { + if (sinmoji.compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) - 1, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get((ad.point.y) - 1).get(ad.point.x); + nextX = ad.point.x; + nextY = (ad.point.y) - 1; + } + } + + final String p_result = result + sinmoji; + + if (nextX == (treasureMap.width) - 1 && nextY == (treasureMap.height) - 1) { + resultList.add(p_result); + } else { + final Parallel newParallel = new Parallel(nextX, nextY, now_world, p_result); + queue.add(newParallel); + } + + if (queue.isEmpty()) { + break; + } + } + + Collections.sort(resultList); + final String resultMassage = resultList.get(0); + return new Result(resultMassage); + } + + private static void output(final Result result) { + System.out.println(result.getMessage()); + } + +} diff --git a/sitou/src/Adventurer.java b/sitou/src/Adventurer.java new file mode 100644 index 0000000..633cb80 --- /dev/null +++ b/sitou/src/Adventurer.java @@ -0,0 +1,15 @@ +package src; + +import java.awt.Point; + +public class Adventurer { + + //冒険家の座標クラス + + final Point point = new Point(); + + public Adventurer(final int x, final int y) { + point.setLocation(x, y); + } + +} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java new file mode 100644 index 0000000..6aa64f6 --- /dev/null +++ b/sitou/src/InputData.java @@ -0,0 +1,16 @@ +package src; + +import java.util.List; + +public class InputData { + final int height; + final int width; + final List mapStatus; + + public InputData(final int height, final int width, final List mapStatus) { + this.height = height; + this.width = width; + this.mapStatus = mapStatus; + } + +} diff --git a/sitou/src/Parallel.java b/sitou/src/Parallel.java new file mode 100644 index 0000000..099210c --- /dev/null +++ b/sitou/src/Parallel.java @@ -0,0 +1,21 @@ +package src; + +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +public class Parallel { + + //queue用にデータをまとめるクラス + + final Point point = new Point(); + List> world = new ArrayList>(); + final String p_result; + + public Parallel(int x, int y, List> world, String p_result) { + point.x = x; + point.y = y; + this.world = world; + this.p_result = p_result; + } +} diff --git a/sitou/src/Result.java b/sitou/src/Result.java new file mode 100644 index 0000000..dc4d4d3 --- /dev/null +++ b/sitou/src/Result.java @@ -0,0 +1,13 @@ +package src; + +public class Result { + final String message; + + public Result(final String message) { + this.message = message; + } + + public final String getMessage() { + return message; + } +} diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java new file mode 100644 index 0000000..9d39c13 --- /dev/null +++ b/sitou/src/TreasureMap.java @@ -0,0 +1,26 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class TreasureMap { + final int height; + final int width; + final List> world = new ArrayList>(); + + public TreasureMap(InputData inputData) { + height = inputData.height; + width = inputData.width; + + //scanした文字列を分解して1文字1マスで扱えるようにする + for (int i = 0; i < height; i++) { + final List list = new ArrayList<>(); + final String mapChar = inputData.mapStatus.get(i); + for (int j = 0; j < width; j++) { + list.add(mapChar.substring(j, j + 1)); + } + world.add(list); + } + } + +} diff --git a/sitou/test/A083_Test.java b/sitou/test/A083_Test.java new file mode 100644 index 0000000..5fc6371 --- /dev/null +++ b/sitou/test/A083_Test.java @@ -0,0 +1,37 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.Arrays; +import org.junit.Test; +import src.A083_SecretMessage; +import src.InputData; +import src.Result; +import src.TreasureMap; + +public class A083_Test { + @Test + public void 正しく探索できるかテスト1() { + + final InputData inputData = new InputData(3,5,Arrays.asList("hello","paiza","world")); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "heailload"; + + assertThat(actual, is(expected)); + } + + public void 最も辞書順で小さいメッセージを探索できるかテスト() { + + final InputData inputData = new InputData(3,3,Arrays.asList("abc","bcx","cyz")); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "abcbcxz"; + + assertThat(actual, is(expected)); + } +} diff --git a/sitou/test/TreasureMapTest.java b/sitou/test/TreasureMapTest.java new file mode 100644 index 0000000..6c52480 --- /dev/null +++ b/sitou/test/TreasureMapTest.java @@ -0,0 +1,73 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class TreasureMapTest { + @Test + public void マスごとに正しく分割できるかテスト() { + + final List> actual = new ArrayList>(); + final List mapStatus = Arrays.asList("hello", "paiza", "world"); + for (int i = 0; i < 3; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 5; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("h", "e", "l", "l", "o"), Arrays.asList("p", "a", "i", "z", "a"), + Arrays.asList("w", "o", "r", "l", "d"))); + + assertThat(actual, is(expected)); + + } + + @Test + public void 秘境の大きさが最小の時に正しく分割できるかテスト() { + final List> actual = new ArrayList>(); + final List mapStatus = Arrays.asList("a"); + for (int i = 0; i < 1; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 1; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("a"))); + + assertThat(actual, is(expected)); + } + + @Test + public void 秘境の大きさが最大の時に正しく分割できるかテスト() { + final List> actual = new ArrayList>(); + final List mapStatus = Arrays + .asList("abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz"); + for (int i = 0; i < 6; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 5; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("a", "b", "c", "d", "e"), Arrays.asList("f", "g", "h", "i", "j"), + Arrays.asList("k", "l", "m", "n", "o"), Arrays.asList("p", "q", "r", "s", "t"), Arrays + .asList("u", "v", "w", "x", "y"), Arrays.asList("z", "z", "z", "z", "z"))); + + assertThat(actual, is(expected)); + } +} -- GitLab From 33afccb99f895bd66c781772b6269cf88c4d20f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 13:27:01 +0900 Subject: [PATCH 02/12] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 140 ++++++++---------------------- sitou/src/Adventurer.java | 15 ---- sitou/src/InputData.java | 6 +- sitou/src/Parallel.java | 21 ----- sitou/src/Result.java | 2 +- sitou/src/TreasureMap.java | 32 ++++--- sitou/test/A083_Test.java | 30 +++++-- sitou/test/TreasureMapTest.java | 96 ++++++++++---------- 8 files changed, 131 insertions(+), 211 deletions(-) delete mode 100644 sitou/src/Adventurer.java delete mode 100644 sitou/src/Parallel.java diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 5eb1009..afe5e3a 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -1,10 +1,7 @@ package src; -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Queue; import java.util.Scanner; public class A083_SecretMessage { @@ -24,10 +21,10 @@ public class A083_SecretMessage { final Scanner scan = new Scanner(System.in); final int height = scan.nextInt(); final int width = scan.nextInt(); - final List mapStatus = new ArrayList(); + final String[] mapStatus = new String[height]; for (int i = 0; i < height; i++) { - mapStatus.add(scan.next()); + mapStatus[i] = scan.next(); } scan.close(); @@ -36,115 +33,46 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { + boolean[][] visited = new boolean[treasureMap.getHeight()][treasureMap.getWidth()]; + List allPaths = new ArrayList<>(); + findPaths(0, 0, "", visited, treasureMap, allPaths); + + //辞書順で早いものを探索 + String smallestPath = allPaths.get(0); + for (String p : allPaths) { + if (p.compareTo(smallestPath) < 0) { + smallestPath = p; + } + } + return new Result(smallestPath); - String result = treasureMap.world.get(0).get(0); - final List resultList = new ArrayList(); - - // 初期値格納 - final Parallel first_time = new Parallel(0, 0, treasureMap.world, result); - final Queue queue = new ArrayDeque<>(); - queue.add(first_time); - - while (true) { - // キューからデータを受け取る - final Parallel parallel = queue.poll(); - - final int nowX = parallel.point.x; - final int nowY = parallel.point.y; - result = parallel.p_result; + } - // 世界はディープコピーする - List> now_world = new ArrayList>(); - for (int i = 0; i < treasureMap.height; i++) { - List list = (List) ((ArrayList) parallel.world.get(i)).clone(); - now_world.add(list); - } + public static void findPaths(int x, int y, String path, boolean[][] visited, + TreasureMap treasureMap, List allPaths) { + //上下左右確認用 + int[] dx = {-1, 1, 0, 0}; + int[] dy = {0, 0, -1, 1}; - // 今いる場所を次に来れないようにする - now_world.get(nowY).set(nowX, "zzz"); - Adventurer ad = new Adventurer(nowX, nowY); - - // 4方向の文字を確認していく - String sinmoji = "zz"; - int nextX = nowX; - int nextY = nowY; - if ((ad.point.x) + 1 < treasureMap.width && sinmoji - .compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) >= 0) { - if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel((ad.point.x) + 1, ad.point.y, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get(ad.point.y).get(ad.point.x + 1); - nextX = (ad.point.x) + 1; - nextY = ad.point.y; - } - } - if ((ad.point.y) + 1 < treasureMap.height && sinmoji - .compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) >= 0) { - if (sinmoji.compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) + 1, now_world, - p_result); - queue.add(newParallel); - - } else { - sinmoji = now_world.get((ad.point.y) + 1).get(ad.point.x); - nextX = ad.point.x; - nextY = (ad.point.y) + 1; - } - } - if (ad.point.x > 0 && sinmoji - .compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) >= 0) { - if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel((ad.point.x) - 1, ad.point.y, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get(ad.point.y).get((ad.point.x) - 1); - nextX = (ad.point.x) - 1; - nextY = ad.point.y; - } - } - if (ad.point.y > 0 && sinmoji - .compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) >= 0) { - if (sinmoji.compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) - 1, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get((ad.point.y) - 1).get(ad.point.x); - nextX = ad.point.x; - nextY = (ad.point.y) - 1; - } - } + //Map外や二度目に通る所のとき + if (x < 0 || y < 0 || x >= treasureMap.getWorld().length || y >= treasureMap.getWorld()[0].length || visited[x][y]) { + return; + } - final String p_result = result + sinmoji; + //ゴールのとき + if (x == treasureMap.getWorld().length - 1 && y == treasureMap.getWorld()[0].length - 1) { + allPaths.add(path + treasureMap.getWorld()[x][y]); + return; + } - if (nextX == (treasureMap.width) - 1 && nextY == (treasureMap.height) - 1) { - resultList.add(p_result); - } else { - final Parallel newParallel = new Parallel(nextX, nextY, now_world, p_result); - queue.add(newParallel); - } + visited[x][y] = true; + path += treasureMap.getWorld()[x][y]; - if (queue.isEmpty()) { - break; - } + for (int i = 0; i < 4; i++) { + findPaths(x + dx[i], y + dy[i], path, visited, treasureMap, allPaths); } - Collections.sort(resultList); - final String resultMassage = resultList.get(0); - return new Result(resultMassage); + visited[x][y] = false; } private static void output(final Result result) { diff --git a/sitou/src/Adventurer.java b/sitou/src/Adventurer.java deleted file mode 100644 index 633cb80..0000000 --- a/sitou/src/Adventurer.java +++ /dev/null @@ -1,15 +0,0 @@ -package src; - -import java.awt.Point; - -public class Adventurer { - - //冒険家の座標クラス - - final Point point = new Point(); - - public Adventurer(final int x, final int y) { - point.setLocation(x, y); - } - -} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java index 6aa64f6..fd402e3 100644 --- a/sitou/src/InputData.java +++ b/sitou/src/InputData.java @@ -1,13 +1,11 @@ package src; -import java.util.List; - public class InputData { final int height; final int width; - final List mapStatus; + final String[] mapStatus; - public InputData(final int height, final int width, final List mapStatus) { + public InputData(final int height, final int width, final String[] mapStatus) { this.height = height; this.width = width; this.mapStatus = mapStatus; diff --git a/sitou/src/Parallel.java b/sitou/src/Parallel.java deleted file mode 100644 index 099210c..0000000 --- a/sitou/src/Parallel.java +++ /dev/null @@ -1,21 +0,0 @@ -package src; - -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -public class Parallel { - - //queue用にデータをまとめるクラス - - final Point point = new Point(); - List> world = new ArrayList>(); - final String p_result; - - public Parallel(int x, int y, List> world, String p_result) { - point.x = x; - point.y = y; - this.world = world; - this.p_result = p_result; - } -} diff --git a/sitou/src/Result.java b/sitou/src/Result.java index dc4d4d3..8d026fd 100644 --- a/sitou/src/Result.java +++ b/sitou/src/Result.java @@ -3,7 +3,7 @@ package src; public class Result { final String message; - public Result(final String message) { + Result(final String message) { this.message = message; } diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index 9d39c13..29f9b7c 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -1,26 +1,34 @@ package src; -import java.util.ArrayList; -import java.util.List; - public class TreasureMap { final int height; - final int width; - final List> world = new ArrayList>(); + private final int width; + final char[][] world; public TreasureMap(InputData inputData) { height = inputData.height; width = inputData.width; + world = new char[getHeight()][getWidth()]; + //scanした文字列を分解して1文字1マスで扱えるようにする - for (int i = 0; i < height; i++) { - final List list = new ArrayList<>(); - final String mapChar = inputData.mapStatus.get(i); - for (int j = 0; j < width; j++) { - list.add(mapChar.substring(j, j + 1)); + for(int i = 0; i < getHeight(); i++) { + String text = inputData.mapStatus[i]; + for(int j = 0; j < getWidth(); j++) { + getWorld()[i][j] = text.charAt(j); } - world.add(list); } } - + + public final int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public final char[][] getWorld() { + return world; + } } diff --git a/sitou/test/A083_Test.java b/sitou/test/A083_Test.java index 5fc6371..c253510 100644 --- a/sitou/test/A083_Test.java +++ b/sitou/test/A083_Test.java @@ -2,7 +2,6 @@ package test; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import java.util.Arrays; import org.junit.Test; import src.A083_SecretMessage; import src.InputData; @@ -11,9 +10,12 @@ import src.TreasureMap; public class A083_Test { @Test - public void 正しく探索できるかテスト1() { + public void 正しく探索できるかテスト() { - final InputData inputData = new InputData(3,5,Arrays.asList("hello","paiza","world")); + final String[] mapStatus = { + "hello", "paiza", "world" + }; + final InputData inputData = new InputData(3, 5, mapStatus); TreasureMap treasureMap = new TreasureMap(inputData); final Result result = A083_SecretMessage.solve(treasureMap); String actual = result.getMessage(); @@ -23,9 +25,12 @@ public class A083_Test { assertThat(actual, is(expected)); } - public void 最も辞書順で小さいメッセージを探索できるかテスト() { + public void 辞書順で最も小さいメッセージを探索できるかテスト1() { - final InputData inputData = new InputData(3,3,Arrays.asList("abc","bcx","cyz")); + final String[] mapStatus = { + "abc", "bcx", "cyz" + }; + final InputData inputData = new InputData(3, 3, mapStatus); TreasureMap treasureMap = new TreasureMap(inputData); final Result result = A083_SecretMessage.solve(treasureMap); String actual = result.getMessage(); @@ -34,4 +39,19 @@ public class A083_Test { assertThat(actual, is(expected)); } + + public void 辞書順で最も小さいメッセージを探索できるかテスト2() { + + final String[] mapStatus = { + "xabcd", "abcde", "bddea", "cdeab", "deabc", "eabcd" + }; + final InputData inputData = new InputData(6, 5, mapStatus); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "xababcdcddbcdeabababcd"; + + assertThat(actual, is(expected)); + } } diff --git a/sitou/test/TreasureMapTest.java b/sitou/test/TreasureMapTest.java index 6c52480..cbaaedf 100644 --- a/sitou/test/TreasureMapTest.java +++ b/sitou/test/TreasureMapTest.java @@ -1,73 +1,75 @@ package test; -import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import org.junit.Test; +import src.InputData; +import src.TreasureMap; public class TreasureMapTest { @Test public void マスごとに正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays.asList("hello", "paiza", "world"); - for (int i = 0; i < 3; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 5; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "hello", "paiza", "world" + }; + InputData input = new InputData(3, 5, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("h", "e", "l", "l", "o"), Arrays.asList("p", "a", "i", "z", "a"), - Arrays.asList("w", "o", "r", "l", "d"))); + final char[][] expected = { + { + 'h', 'e', 'l', 'l', 'o' + }, { + 'p', 'a', 'i', 'z', 'a' + }, { + 'w', 'o', 'r', 'l', 'd' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } @Test public void 秘境の大きさが最小の時に正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays.asList("a"); - for (int i = 0; i < 1; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 1; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "a" + }; + InputData input = new InputData(1, 1, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("a"))); + final char[][] expected = { + { + 'a' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } @Test public void 秘境の大きさが最大の時に正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays - .asList("abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz"); - for (int i = 0; i < 6; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 5; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz" + }; + InputData input = new InputData(6, 5, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("a", "b", "c", "d", "e"), Arrays.asList("f", "g", "h", "i", "j"), - Arrays.asList("k", "l", "m", "n", "o"), Arrays.asList("p", "q", "r", "s", "t"), Arrays - .asList("u", "v", "w", "x", "y"), Arrays.asList("z", "z", "z", "z", "z"))); + final char[][] expected = { + { + 'a', 'b', 'c', 'd', 'e' + }, { + 'f', 'g', 'h', 'i', 'j' + }, { + 'k', 'l', 'm', 'n', 'o' + }, { + 'p', 'q', 'r', 's', 't' + }, { + 'u', 'v', 'w', 'x', 'y' + }, { + 'z', 'z', 'z', 'z', 'z' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } } -- GitLab From 4701b5c0de0bde508a097dbcb6e39bc065496de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 15:43:40 +0900 Subject: [PATCH 03/12] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 53 ++++++++++++++++++++++--------- sitou/src/TreasureMap.java | 29 ++++++++++++----- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index afe5e3a..5d93b58 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,11 +33,11 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { - boolean[][] visited = new boolean[treasureMap.getHeight()][treasureMap.getWidth()]; + List allPaths = new ArrayList<>(); - findPaths(0, 0, "", visited, treasureMap, allPaths); + findPaths(0, 0, "", treasureMap, allPaths); - //辞書順で早いものを探索 + // 辞書順で早いものを探索 String smallestPath = allPaths.get(0); for (String p : allPaths) { if (p.compareTo(smallestPath) < 0) { @@ -47,32 +47,55 @@ public class A083_SecretMessage { return new Result(smallestPath); } + + public enum Direction{ + UP(0, -1), + DOWN(0,1), + LEFT(-1,0), + RIGHT(1,0); + + private final int x; + private final int y; + + private Direction(final int x, final int y) { + this.x = x; + this.y = y; + } + + public final int getX() { + return x; + } + + public final int getY() { + return y; + } + } - public static void findPaths(int x, int y, String path, boolean[][] visited, + public static void findPaths(int x, int y, String path, TreasureMap treasureMap, List allPaths) { - //上下左右確認用 - int[] dx = {-1, 1, 0, 0}; - int[] dy = {0, 0, -1, 1}; - //Map外や二度目に通る所のとき - if (x < 0 || y < 0 || x >= treasureMap.getWorld().length || y >= treasureMap.getWorld()[0].length || visited[x][y]) { + // Map外や二度目に通る所のとき + if (x < 0 || y < 0 || x >= treasureMap.getHeight() || y >= treasureMap.getWidth() + || treasureMap.visited[x][y]) { return; } - //ゴールのとき + // ゴールのとき if (x == treasureMap.getWorld().length - 1 && y == treasureMap.getWorld()[0].length - 1) { allPaths.add(path + treasureMap.getWorld()[x][y]); return; } - visited[x][y] = true; - path += treasureMap.getWorld()[x][y]; + treasureMap.mark(x, y); - for (int i = 0; i < 4; i++) { - findPaths(x + dx[i], y + dy[i], path, visited, treasureMap, allPaths); + path += treasureMap.getWorld()[x][y]; + + for(Direction direction : Direction.values()) { + findPaths(x + direction.getX(), y + direction.getY(), path, treasureMap, allPaths); } - visited[x][y] = false; + treasureMap.erase(x, y); + } private static void output(final Result result) { diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index 29f9b7c..ccf2571 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -2,33 +2,46 @@ package src; public class TreasureMap { final int height; - private final int width; + final int width; final char[][] world; + final boolean[][] visited; public TreasureMap(InputData inputData) { height = inputData.height; width = inputData.width; world = new char[getHeight()][getWidth()]; + visited = new boolean[getHeight()][getWidth()]; - - //scanした文字列を分解して1文字1マスで扱えるようにする - for(int i = 0; i < getHeight(); i++) { + // scanした文字列を分解して1文字1マスで扱えるようにする + for (int i = 0; i < getHeight(); i++) { String text = inputData.mapStatus[i]; - for(int j = 0; j < getWidth(); j++) { + for (int j = 0; j < getWidth(); j++) { getWorld()[i][j] = text.charAt(j); } } } - + + public void mark(final int x, final int y) { + visited[x][y] = true; + } + + public void erase(final int x, final int y) { + visited[x][y] = false; + } + public final int getHeight() { return height; } - + public int getWidth() { return width; } - + public final char[][] getWorld() { return world; } + + public final boolean[][] getVisited() { + return visited; + } } -- GitLab From 8dad2e92dd54900964e2977d16dd9a6d23c27c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 16:31:30 +0900 Subject: [PATCH 04/12] =?UTF-8?q?treasureMap.get(0,0)=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 1 + sitou/src/TreasureMap.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 5d93b58..7419321 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,6 +33,7 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { + treasureMap.get(0,0); List allPaths = new ArrayList<>(); findPaths(0, 0, "", treasureMap, allPaths); diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index ccf2571..e8d2fea 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -44,4 +44,9 @@ public class TreasureMap { public final boolean[][] getVisited() { return visited; } + + public final char get(int x, int y) { + return world[x][y]; + + } } -- GitLab From 6d257a3920aa4d0a7277f2d551982d6fd39808f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 16:48:19 +0900 Subject: [PATCH 05/12] =?UTF-8?q?isVisited=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 26 +++++++++++++------------- sitou/src/TreasureMap.java | 8 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 7419321..460844d 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,7 +33,7 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { - treasureMap.get(0,0); + treasureMap.get(0, 0); List allPaths = new ArrayList<>(); findPaths(0, 0, "", treasureMap, allPaths); @@ -48,25 +48,25 @@ public class A083_SecretMessage { return new Result(smallestPath); } - - public enum Direction{ + + public enum Direction { UP(0, -1), - DOWN(0,1), - LEFT(-1,0), - RIGHT(1,0); - + DOWN(0, 1), + LEFT(-1, 0), + RIGHT(1, 0); + private final int x; private final int y; - + private Direction(final int x, final int y) { this.x = x; this.y = y; } - + public final int getX() { return x; } - + public final int getY() { return y; } @@ -77,7 +77,7 @@ public class A083_SecretMessage { // Map外や二度目に通る所のとき if (x < 0 || y < 0 || x >= treasureMap.getHeight() || y >= treasureMap.getWidth() - || treasureMap.visited[x][y]) { + || treasureMap.isVisited(x, y)) { return; } @@ -90,8 +90,8 @@ public class A083_SecretMessage { treasureMap.mark(x, y); path += treasureMap.getWorld()[x][y]; - - for(Direction direction : Direction.values()) { + + for (Direction direction : Direction.values()) { findPaths(x + direction.getX(), y + direction.getY(), path, treasureMap, allPaths); } diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index e8d2fea..0e1fef0 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -41,12 +41,12 @@ public class TreasureMap { return world; } - public final boolean[][] getVisited() { - return visited; + public final boolean isVisited(final int x, final int y) { + return visited[x][y]; } - public final char get(int x, int y) { + public final char get(final int x, final int y) { return world[x][y]; - + } } -- GitLab From 4d0c1c1815ed696c0e29ae023b2253b7c4ac4fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Wed, 14 Aug 2024 14:53:04 +0900 Subject: [PATCH 06/12] =?UTF-8?q?paiza=E3=81=AEB015=E3=81=AE=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 106 ---------------------- sitou/src/B015_7segment.java | 145 ++++++++++++++++++++++++++++++ sitou/src/InputData.java | 24 +++-- sitou/src/Result.java | 12 +-- sitou/src/TreasureMap.java | 52 ----------- sitou/test/A083_Test.java | 57 ------------ sitou/test/B015_Test.java | 56 ++++++++++++ sitou/test/TreasureMapTest.java | 75 ---------------- 8 files changed, 224 insertions(+), 303 deletions(-) delete mode 100644 sitou/src/A083_SecretMessage.java create mode 100644 sitou/src/B015_7segment.java delete mode 100644 sitou/src/TreasureMap.java delete mode 100644 sitou/test/A083_Test.java create mode 100644 sitou/test/B015_Test.java delete mode 100644 sitou/test/TreasureMapTest.java diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java deleted file mode 100644 index 460844d..0000000 --- a/sitou/src/A083_SecretMessage.java +++ /dev/null @@ -1,106 +0,0 @@ -package src; - -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class A083_SecretMessage { - - public static void main(String[] args) { - execute(); - } - - static void execute() { - final InputData inputData = input(); - final TreasureMap treasureMap = new TreasureMap(inputData); - final Result result = solve(treasureMap); - output(result); - } - - private static InputData input() { - final Scanner scan = new Scanner(System.in); - final int height = scan.nextInt(); - final int width = scan.nextInt(); - final String[] mapStatus = new String[height]; - - for (int i = 0; i < height; i++) { - mapStatus[i] = scan.next(); - } - - scan.close(); - return new InputData(height, width, mapStatus); - - } - - public static Result solve(TreasureMap treasureMap) { - treasureMap.get(0, 0); - - List allPaths = new ArrayList<>(); - findPaths(0, 0, "", treasureMap, allPaths); - - // 辞書順で早いものを探索 - String smallestPath = allPaths.get(0); - for (String p : allPaths) { - if (p.compareTo(smallestPath) < 0) { - smallestPath = p; - } - } - return new Result(smallestPath); - - } - - public enum Direction { - UP(0, -1), - DOWN(0, 1), - LEFT(-1, 0), - RIGHT(1, 0); - - private final int x; - private final int y; - - private Direction(final int x, final int y) { - this.x = x; - this.y = y; - } - - public final int getX() { - return x; - } - - public final int getY() { - return y; - } - } - - public static void findPaths(int x, int y, String path, - TreasureMap treasureMap, List allPaths) { - - // Map外や二度目に通る所のとき - if (x < 0 || y < 0 || x >= treasureMap.getHeight() || y >= treasureMap.getWidth() - || treasureMap.isVisited(x, y)) { - return; - } - - // ゴールのとき - if (x == treasureMap.getWorld().length - 1 && y == treasureMap.getWorld()[0].length - 1) { - allPaths.add(path + treasureMap.getWorld()[x][y]); - return; - } - - treasureMap.mark(x, y); - - path += treasureMap.getWorld()[x][y]; - - for (Direction direction : Direction.values()) { - findPaths(x + direction.getX(), y + direction.getY(), path, treasureMap, allPaths); - } - - treasureMap.erase(x, y); - - } - - private static void output(final Result result) { - System.out.println(result.getMessage()); - } - -} diff --git a/sitou/src/B015_7segment.java b/sitou/src/B015_7segment.java new file mode 100644 index 0000000..f091e08 --- /dev/null +++ b/sitou/src/B015_7segment.java @@ -0,0 +1,145 @@ +package src; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +public class B015_7segment { + public static void main(String[] args) { + execute(); + } + + static void execute() { + final InputData inputData = input(); + final Result result = solveLightNumber(inputData); + output(result); + } + + private static InputData input() { + final Scanner scan = new Scanner(System.in); + final List leftSegment = new ArrayList<>(); + final List rightSegment = new ArrayList<>(); + + try { + for (int i = 0; i < 7; i++) { + leftSegment.add(scan.nextInt()); + } + for (int i = 0; i < 7; i++) { + rightSegment.add(scan.nextInt()); + } + } finally { + scan.close(); + } + + return new InputData(leftSegment, rightSegment); + + } + + public static Result solveLightNumber(InputData inputData) { + final List result = new ArrayList<>(); + + result.add(checkWhetherNumber(inputData)); + + // 対称移動 + InputData insideOutData = insideOut(inputData); + result.add(checkWhetherNumber(insideOutData)); + + // 対称移動+上下反転=回転移動 + InputData upsideDownData = upsideDown(insideOutData); + result.add(checkWhetherNumber(upsideDownData)); + + return new Result(result); + + } + + public static String checkWhetherNumber(InputData inputData) { + // リストを1つの文字列にする + String ls = ""; + String rs = ""; + for (Integer n : inputData.getLeftSegment()) { + ls += n; + } + for (Integer n : inputData.getRightSegment()) { + rs += n; + } + + final boolean isNumberLeft = isNumber(ls); + final boolean isNumberRight = isNumber(rs); + + String isNumberBoth = "No"; + if (isNumberLeft && isNumberRight) { + isNumberBoth = "Yes"; + } + + return isNumberBoth; + } + + private static boolean isNumber(final String seg) { + for (NumberPatterns numberPattern : NumberPatterns.values()) { + if (seg.equals(numberPattern.getPattern())) { + return true; + } + } + return false; + } + + public static InputData insideOut(final InputData inputData) { + List leftSegment = new ArrayList<>(inputData.getLeftSegment()); + List rightSegment = new ArrayList<>(inputData.getRightSegment()); + Collections.swap(leftSegment, 1, 5); + Collections.swap(leftSegment, 2, 4); + Collections.swap(rightSegment, 1, 5); + Collections.swap(rightSegment, 2, 4); + + List kari = new ArrayList<>(leftSegment); + leftSegment = new ArrayList<>(rightSegment); + rightSegment = new ArrayList<>(kari); + + return new InputData(leftSegment, rightSegment); + } + + public static InputData upsideDown(final InputData inputData) { + List leftSegment = new ArrayList<>(inputData.getLeftSegment()); + List rightSegment = new ArrayList<>(inputData.getRightSegment()); + Collections.swap(leftSegment, 0, 3); + Collections.swap(leftSegment, 1, 2); + Collections.swap(leftSegment, 4, 5); + Collections.swap(rightSegment, 0, 3); + Collections.swap(rightSegment, 1, 2); + Collections.swap(rightSegment, 4, 5); + + return new InputData(leftSegment, rightSegment); + } + + public enum NumberPatterns { + // 各数字に対応する7セグメントディスプレイの状態 + ZERO("1111110"), + ONE("0110000"), + TWO("1101101"), + THREE("1111001"), + FOUR("0110011"), + FIVE("1011011"), + SIX("1011111"), + SEVEN("1110010"), + EIGHT("1111111"), + NINE("1111011"); + + private final String pattern; + + private NumberPatterns(final String pattern) { + this.pattern = pattern; + } + + public final String getPattern() { + return pattern; + } + } + + private static void output(final Result result) { + for (int i = 0; i < 3; i++) { + System.out.println(result.getIsNumber().get(i)); + } + } + +} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java index fd402e3..19809a1 100644 --- a/sitou/src/InputData.java +++ b/sitou/src/InputData.java @@ -1,14 +1,22 @@ package src; +import java.util.List; + public class InputData { - final int height; - final int width; - final String[] mapStatus; - - public InputData(final int height, final int width, final String[] mapStatus) { - this.height = height; - this.width = width; - this.mapStatus = mapStatus; + private final List leftSegment; + private final List rightSegment; + + public InputData(final List leftSegment, final List rightSegment) { + this.leftSegment = leftSegment; + this.rightSegment = rightSegment; + } + + public final List getLeftSegment() { + return leftSegment; + } + + public final List getRightSegment() { + return rightSegment; } } diff --git a/sitou/src/Result.java b/sitou/src/Result.java index 8d026fd..fcc302e 100644 --- a/sitou/src/Result.java +++ b/sitou/src/Result.java @@ -1,13 +1,15 @@ package src; +import java.util.List; + public class Result { - final String message; + final List isNumber; - Result(final String message) { - this.message = message; + Result(final List isNumber) { + this.isNumber = isNumber; } - public final String getMessage() { - return message; + public final List getIsNumber() { + return isNumber; } } diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java deleted file mode 100644 index 0e1fef0..0000000 --- a/sitou/src/TreasureMap.java +++ /dev/null @@ -1,52 +0,0 @@ -package src; - -public class TreasureMap { - final int height; - final int width; - final char[][] world; - final boolean[][] visited; - - public TreasureMap(InputData inputData) { - height = inputData.height; - width = inputData.width; - world = new char[getHeight()][getWidth()]; - visited = new boolean[getHeight()][getWidth()]; - - // scanした文字列を分解して1文字1マスで扱えるようにする - for (int i = 0; i < getHeight(); i++) { - String text = inputData.mapStatus[i]; - for (int j = 0; j < getWidth(); j++) { - getWorld()[i][j] = text.charAt(j); - } - } - } - - public void mark(final int x, final int y) { - visited[x][y] = true; - } - - public void erase(final int x, final int y) { - visited[x][y] = false; - } - - public final int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public final char[][] getWorld() { - return world; - } - - public final boolean isVisited(final int x, final int y) { - return visited[x][y]; - } - - public final char get(final int x, final int y) { - return world[x][y]; - - } -} diff --git a/sitou/test/A083_Test.java b/sitou/test/A083_Test.java deleted file mode 100644 index c253510..0000000 --- a/sitou/test/A083_Test.java +++ /dev/null @@ -1,57 +0,0 @@ -package test; - -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import org.junit.Test; -import src.A083_SecretMessage; -import src.InputData; -import src.Result; -import src.TreasureMap; - -public class A083_Test { - @Test - public void 正しく探索できるかテスト() { - - final String[] mapStatus = { - "hello", "paiza", "world" - }; - final InputData inputData = new InputData(3, 5, mapStatus); - TreasureMap treasureMap = new TreasureMap(inputData); - final Result result = A083_SecretMessage.solve(treasureMap); - String actual = result.getMessage(); - - final String expected = "heailload"; - - assertThat(actual, is(expected)); - } - - public void 辞書順で最も小さいメッセージを探索できるかテスト1() { - - final String[] mapStatus = { - "abc", "bcx", "cyz" - }; - final InputData inputData = new InputData(3, 3, mapStatus); - TreasureMap treasureMap = new TreasureMap(inputData); - final Result result = A083_SecretMessage.solve(treasureMap); - String actual = result.getMessage(); - - final String expected = "abcbcxz"; - - assertThat(actual, is(expected)); - } - - public void 辞書順で最も小さいメッセージを探索できるかテスト2() { - - final String[] mapStatus = { - "xabcd", "abcde", "bddea", "cdeab", "deabc", "eabcd" - }; - final InputData inputData = new InputData(6, 5, mapStatus); - TreasureMap treasureMap = new TreasureMap(inputData); - final Result result = A083_SecretMessage.solve(treasureMap); - String actual = result.getMessage(); - - final String expected = "xababcdcddbcdeabababcd"; - - assertThat(actual, is(expected)); - } -} diff --git a/sitou/test/B015_Test.java b/sitou/test/B015_Test.java new file mode 100644 index 0000000..12fe4ec --- /dev/null +++ b/sitou/test/B015_Test.java @@ -0,0 +1,56 @@ +package test; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import src.B015_7segment; +import src.InputData; +import src.Result; + +public class B015_Test { + @Test + public void 正しく判定できるかテスト() { + final InputData inputData = new InputData(Arrays.asList(1, 1, 1, 1, 0, 1, 1), Arrays + .asList(0, 1, 1, 0, 0, 0, 0)); + final Result result = B015_7segment.solveLightNumber(inputData); + final List actual = result.getIsNumber(); + + final List expected = Arrays.asList("Yes", "No", "No"); + + assertThat(actual, is(expected)); + } + + @Test + public void 正しく表裏反転できるかテスト() { + InputData inputData = new InputData(Arrays.asList(1, 1, 1, 1, 0, 1, 1), Arrays + .asList(0, 1, 1, 0, 0, 0, 0)); + InputData insideOutData = B015_7segment.insideOut(inputData); + List actualLeft = new ArrayList<>(insideOutData.getLeftSegment()); + List actualRight = new ArrayList<>(insideOutData.getRightSegment()); + + List expectedLeft = Arrays.asList(0, 0, 0, 0, 1, 1, 0); + List expectedRight = Arrays.asList(1, 1, 0, 1, 1, 1, 1); + + assertThat(actualLeft, is(expectedLeft)); + assertThat(actualRight, is(expectedRight)); + } + + @Test + public void 正しく上下反転できるかテスト() { + InputData inputData = new InputData(Arrays.asList(0, 0, 0, 0, 1, 1, 0), Arrays + .asList(1, 1, 0, 1, 1, 1, 1)); + InputData upsideDownData = B015_7segment.upsideDown(inputData); + List actualLeft = new ArrayList<>(upsideDownData.getLeftSegment()); + List actualRight = new ArrayList<>(upsideDownData.getRightSegment()); + + List expectedLeft = Arrays.asList(0, 0, 0, 0, 1, 1, 0); + List expectedRight = Arrays.asList(1, 0, 1, 1, 1, 1, 1); + + assertThat(actualLeft, is(expectedLeft)); + assertThat(actualRight, is(expectedRight)); + } + +} diff --git a/sitou/test/TreasureMapTest.java b/sitou/test/TreasureMapTest.java deleted file mode 100644 index cbaaedf..0000000 --- a/sitou/test/TreasureMapTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package test; - -import static org.junit.Assert.*; -import org.junit.Test; -import src.InputData; -import src.TreasureMap; - -public class TreasureMapTest { - @Test - public void マスごとに正しく分割できるかテスト() { - - final String[] mapStatus = { - "hello", "paiza", "world" - }; - InputData input = new InputData(3, 5, mapStatus); - TreasureMap actual = new TreasureMap(input); - - final char[][] expected = { - { - 'h', 'e', 'l', 'l', 'o' - }, { - 'p', 'a', 'i', 'z', 'a' - }, { - 'w', 'o', 'r', 'l', 'd' - } - }; - - assertArrayEquals(actual.getWorld(), expected); - - } - - @Test - public void 秘境の大きさが最小の時に正しく分割できるかテスト() { - final String[] mapStatus = { - "a" - }; - InputData input = new InputData(1, 1, mapStatus); - TreasureMap actual = new TreasureMap(input); - - final char[][] expected = { - { - 'a' - } - }; - - assertArrayEquals(actual.getWorld(), expected); - } - - @Test - public void 秘境の大きさが最大の時に正しく分割できるかテスト() { - final String[] mapStatus = { - "abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz" - }; - InputData input = new InputData(6, 5, mapStatus); - TreasureMap actual = new TreasureMap(input); - - final char[][] expected = { - { - 'a', 'b', 'c', 'd', 'e' - }, { - 'f', 'g', 'h', 'i', 'j' - }, { - 'k', 'l', 'm', 'n', 'o' - }, { - 'p', 'q', 'r', 's', 't' - }, { - 'u', 'v', 'w', 'x', 'y' - }, { - 'z', 'z', 'z', 'z', 'z' - } - }; - - assertArrayEquals(actual.getWorld(), expected); - } -} -- GitLab From cd631f328768a38220d51b88dca9076304309c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 20 Aug 2024 09:20:20 +0900 Subject: [PATCH 07/12] =?UTF-8?q?paiza=E3=81=AEB026=E3=81=AE=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B015_7segment.java | 145 -------------------------------- sitou/src/B026.java | 152 ++++++++++++++++++++++++++++++++++ sitou/src/Customer.java | 34 ++++++++ sitou/src/InputData.java | 24 ++++-- sitou/src/Result.java | 10 +-- sitou/src/VendingMachine.java | 13 +++ sitou/test/B015_Test.java | 56 ------------- sitou/test/B026_Test.java | 88 ++++++++++++++++++++ 8 files changed, 307 insertions(+), 215 deletions(-) delete mode 100644 sitou/src/B015_7segment.java create mode 100644 sitou/src/B026.java create mode 100644 sitou/src/Customer.java create mode 100644 sitou/src/VendingMachine.java delete mode 100644 sitou/test/B015_Test.java create mode 100644 sitou/test/B026_Test.java diff --git a/sitou/src/B015_7segment.java b/sitou/src/B015_7segment.java deleted file mode 100644 index f091e08..0000000 --- a/sitou/src/B015_7segment.java +++ /dev/null @@ -1,145 +0,0 @@ -package src; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Scanner; - -public class B015_7segment { - public static void main(String[] args) { - execute(); - } - - static void execute() { - final InputData inputData = input(); - final Result result = solveLightNumber(inputData); - output(result); - } - - private static InputData input() { - final Scanner scan = new Scanner(System.in); - final List leftSegment = new ArrayList<>(); - final List rightSegment = new ArrayList<>(); - - try { - for (int i = 0; i < 7; i++) { - leftSegment.add(scan.nextInt()); - } - for (int i = 0; i < 7; i++) { - rightSegment.add(scan.nextInt()); - } - } finally { - scan.close(); - } - - return new InputData(leftSegment, rightSegment); - - } - - public static Result solveLightNumber(InputData inputData) { - final List result = new ArrayList<>(); - - result.add(checkWhetherNumber(inputData)); - - // 対称移動 - InputData insideOutData = insideOut(inputData); - result.add(checkWhetherNumber(insideOutData)); - - // 対称移動+上下反転=回転移動 - InputData upsideDownData = upsideDown(insideOutData); - result.add(checkWhetherNumber(upsideDownData)); - - return new Result(result); - - } - - public static String checkWhetherNumber(InputData inputData) { - // リストを1つの文字列にする - String ls = ""; - String rs = ""; - for (Integer n : inputData.getLeftSegment()) { - ls += n; - } - for (Integer n : inputData.getRightSegment()) { - rs += n; - } - - final boolean isNumberLeft = isNumber(ls); - final boolean isNumberRight = isNumber(rs); - - String isNumberBoth = "No"; - if (isNumberLeft && isNumberRight) { - isNumberBoth = "Yes"; - } - - return isNumberBoth; - } - - private static boolean isNumber(final String seg) { - for (NumberPatterns numberPattern : NumberPatterns.values()) { - if (seg.equals(numberPattern.getPattern())) { - return true; - } - } - return false; - } - - public static InputData insideOut(final InputData inputData) { - List leftSegment = new ArrayList<>(inputData.getLeftSegment()); - List rightSegment = new ArrayList<>(inputData.getRightSegment()); - Collections.swap(leftSegment, 1, 5); - Collections.swap(leftSegment, 2, 4); - Collections.swap(rightSegment, 1, 5); - Collections.swap(rightSegment, 2, 4); - - List kari = new ArrayList<>(leftSegment); - leftSegment = new ArrayList<>(rightSegment); - rightSegment = new ArrayList<>(kari); - - return new InputData(leftSegment, rightSegment); - } - - public static InputData upsideDown(final InputData inputData) { - List leftSegment = new ArrayList<>(inputData.getLeftSegment()); - List rightSegment = new ArrayList<>(inputData.getRightSegment()); - Collections.swap(leftSegment, 0, 3); - Collections.swap(leftSegment, 1, 2); - Collections.swap(leftSegment, 4, 5); - Collections.swap(rightSegment, 0, 3); - Collections.swap(rightSegment, 1, 2); - Collections.swap(rightSegment, 4, 5); - - return new InputData(leftSegment, rightSegment); - } - - public enum NumberPatterns { - // 各数字に対応する7セグメントディスプレイの状態 - ZERO("1111110"), - ONE("0110000"), - TWO("1101101"), - THREE("1111001"), - FOUR("0110011"), - FIVE("1011011"), - SIX("1011111"), - SEVEN("1110010"), - EIGHT("1111111"), - NINE("1111011"); - - private final String pattern; - - private NumberPatterns(final String pattern) { - this.pattern = pattern; - } - - public final String getPattern() { - return pattern; - } - } - - private static void output(final Result result) { - for (int i = 0; i < 3; i++) { - System.out.println(result.getIsNumber().get(i)); - } - } - -} diff --git a/sitou/src/B026.java b/sitou/src/B026.java new file mode 100644 index 0000000..b069b56 --- /dev/null +++ b/sitou/src/B026.java @@ -0,0 +1,152 @@ +package src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B026 { + public static void main(String[] args) { + execute(); + } + + static void execute() { + final InputData inputData = input(); + final Result result = solveChange(inputData); + output(inputData, result); + } + + private static InputData input() { + final Scanner scan = new Scanner(System.in); + final int[] coinsInMachine = new int[4]; + final int numOfCustomer; + final List> customers = new ArrayList<>(); + + try { + for (int i = 0; i < 4; i++) { + coinsInMachine[i] = scan.nextInt(); + } + numOfCustomer = scan.nextInt(); + for (int i = 0; i < numOfCustomer; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < 5; j++) { + list.add(scan.nextInt()); + } + customers.add(list); + } + } finally { + scan.close(); + } + + return new InputData(coinsInMachine, numOfCustomer, customers); + } + + public static Result solveChange(InputData inputData) { + final List result = new ArrayList<>(); + VendingMachine vm = new VendingMachine(inputData.getCoinsInMachine()); + + for (int n = 0; n < inputData.getNumOfCustomer(); n++) { + final Customer c = new Customer(inputData.getCustomer(n)); + + result.add(calculateChange(vm, c)); + } + return new Result(result); + } + + static String calculateChange(final VendingMachine vm, final Customer customer) { + String s = ""; + final int[] coinsOfChange = {0, 0, 0, 0}; + final int[] first = {vm.getCoins()[0],vm.getCoins()[1],vm.getCoins()[2],vm.getCoins()[3]}; + final int[] coinsInMachine = vm.getCoins(); + final int change = customer.getSumOfMoney() - customer.getDrinkPrice(); + + if (canChange(change,coinsInMachine,coinsOfChange)) { + //おつりを排出できるとき硬貨の枚数を出力 + for (int i = 0; i < 4; i++) { + coinsInMachine[i] += customer.getCoin().get(i); + } + + s = coinsOfChange[0] + + " " + + coinsOfChange[1] + + " " + + coinsOfChange[2] + + " " + + coinsOfChange[3]; + + } else { + //できないときは自販機の硬貨の枚数を計算前に戻す + s = "impossible"; + coinsInMachine[0] = first[0]; + coinsInMachine[1] = first[1]; + coinsInMachine[2] = first[2]; + coinsInMachine[3] = first[3]; + } + + return s; + } + + static boolean canChange(int change, int[] coinsInMachine, int[] coinsOfChange) { + while (change >0) { + if (change - 500 >= 0) { + + if (coinsInMachine[0] > 0) { + coinsOfChange[0]++; + coinsInMachine[0]--; + } else if (coinsInMachine[1] >= 5) { + coinsOfChange[1] += 5; + coinsInMachine[1] -= 5; + } else { + return false; + } + change -= 500; + continue; + + } else if (change - 100 >= 0) { + + if (coinsInMachine[1] > 0) { + coinsOfChange[1]++; + coinsInMachine[1]--; + } else { + return false; + } + change -= 100; + continue; + + } else if (change - 50 >= 0) { + + if (coinsInMachine[2] > 0) { + coinsOfChange[2]++; + coinsInMachine[2]--; + } else if (coinsInMachine[3] >= 5) { + coinsOfChange[3] += 5; + coinsInMachine[3] -= 5; + } else { + return false; + } + change -= 50; + continue; + + } else if (change - 10 >= 0) { + + if (coinsInMachine[3] > 0) { + coinsOfChange[3]++; + coinsInMachine[3]--; + } else { + return false; + } + change -= 10; + continue; + + } + } + + return true; + } + + private static void output(final InputData inputData, final Result result) { + for (int i = 0; i < inputData.getNumOfCustomer(); i++) { + System.out.println(result.getChange().get(i)); + } + } + +} diff --git a/sitou/src/Customer.java b/sitou/src/Customer.java new file mode 100644 index 0000000..e3e6f5f --- /dev/null +++ b/sitou/src/Customer.java @@ -0,0 +1,34 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class Customer { + private final int drinkPrice; + private final List coin = new ArrayList<>(); + private final int sumOfMoney; + + Customer(List customer){ + drinkPrice = customer.get(0); + for(int i = 1; i < 5; i++) { + coin.add(customer.get(i)); + } + int money = 500*coin.get(0); + money += 100*coin.get(1); + money += 50*coin.get(2); + money += 10*coin.get(3); + sumOfMoney = money; + } + + final int getDrinkPrice() { + return drinkPrice; + } + + final List getCoin(){ + return coin; + } + + final int getSumOfMoney() { + return sumOfMoney; + } +} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java index 19809a1..eb04726 100644 --- a/sitou/src/InputData.java +++ b/sitou/src/InputData.java @@ -3,20 +3,26 @@ package src; import java.util.List; public class InputData { - private final List leftSegment; - private final List rightSegment; + private int[] coinsInMachine = new int[4]; + private final int numOfCustomer; + private final List> customers; - public InputData(final List leftSegment, final List rightSegment) { - this.leftSegment = leftSegment; - this.rightSegment = rightSegment; + public InputData(final int[] coinsInMachine, int numOfCustomer, final List> customers) { + this.coinsInMachine = coinsInMachine; + this.numOfCustomer = numOfCustomer; + this.customers = customers; } - public final List getLeftSegment() { - return leftSegment; + final int[] getCoinsInMachine() { + return coinsInMachine; } - public final List getRightSegment() { - return rightSegment; + final int getNumOfCustomer() { + return numOfCustomer; + } + + final List getCustomer(int n){ + return customers.get(n); } } diff --git a/sitou/src/Result.java b/sitou/src/Result.java index fcc302e..410c25a 100644 --- a/sitou/src/Result.java +++ b/sitou/src/Result.java @@ -3,13 +3,13 @@ package src; import java.util.List; public class Result { - final List isNumber; + final List change; - Result(final List isNumber) { - this.isNumber = isNumber; + Result(final List change) { + this.change = change; } - public final List getIsNumber() { - return isNumber; + public final List getChange() { + return change; } } diff --git a/sitou/src/VendingMachine.java b/sitou/src/VendingMachine.java new file mode 100644 index 0000000..81a64fb --- /dev/null +++ b/sitou/src/VendingMachine.java @@ -0,0 +1,13 @@ +package src; + +public class VendingMachine { + private int[] coins = new int[4]; + + VendingMachine(int[] coins) { + this.coins = coins; + } + + final int[] getCoins() { + return coins; + } +} diff --git a/sitou/test/B015_Test.java b/sitou/test/B015_Test.java deleted file mode 100644 index 12fe4ec..0000000 --- a/sitou/test/B015_Test.java +++ /dev/null @@ -1,56 +0,0 @@ -package test; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.Test; -import src.B015_7segment; -import src.InputData; -import src.Result; - -public class B015_Test { - @Test - public void 正しく判定できるかテスト() { - final InputData inputData = new InputData(Arrays.asList(1, 1, 1, 1, 0, 1, 1), Arrays - .asList(0, 1, 1, 0, 0, 0, 0)); - final Result result = B015_7segment.solveLightNumber(inputData); - final List actual = result.getIsNumber(); - - final List expected = Arrays.asList("Yes", "No", "No"); - - assertThat(actual, is(expected)); - } - - @Test - public void 正しく表裏反転できるかテスト() { - InputData inputData = new InputData(Arrays.asList(1, 1, 1, 1, 0, 1, 1), Arrays - .asList(0, 1, 1, 0, 0, 0, 0)); - InputData insideOutData = B015_7segment.insideOut(inputData); - List actualLeft = new ArrayList<>(insideOutData.getLeftSegment()); - List actualRight = new ArrayList<>(insideOutData.getRightSegment()); - - List expectedLeft = Arrays.asList(0, 0, 0, 0, 1, 1, 0); - List expectedRight = Arrays.asList(1, 1, 0, 1, 1, 1, 1); - - assertThat(actualLeft, is(expectedLeft)); - assertThat(actualRight, is(expectedRight)); - } - - @Test - public void 正しく上下反転できるかテスト() { - InputData inputData = new InputData(Arrays.asList(0, 0, 0, 0, 1, 1, 0), Arrays - .asList(1, 1, 0, 1, 1, 1, 1)); - InputData upsideDownData = B015_7segment.upsideDown(inputData); - List actualLeft = new ArrayList<>(upsideDownData.getLeftSegment()); - List actualRight = new ArrayList<>(upsideDownData.getRightSegment()); - - List expectedLeft = Arrays.asList(0, 0, 0, 0, 1, 1, 0); - List expectedRight = Arrays.asList(1, 0, 1, 1, 1, 1, 1); - - assertThat(actualLeft, is(expectedLeft)); - assertThat(actualRight, is(expectedRight)); - } - -} diff --git a/sitou/test/B026_Test.java b/sitou/test/B026_Test.java new file mode 100644 index 0000000..d1ca6ec --- /dev/null +++ b/sitou/test/B026_Test.java @@ -0,0 +1,88 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import src.B026; +import src.InputData; +import src.Result; + +public class B026_Test { + @Test + public void 最後の人が購入不可() { + + final int[] coins = {1,4,1,20}; + final List> customers = Arrays.asList(Arrays.asList(130,1,0,0,0),Arrays.asList(150,0,2,0,0),Arrays.asList(100,1,0,0,0)); + + final InputData inputData = new InputData(coins,3,customers); + final Result result = B026.solveChange(inputData); + List actual = result.getChange(); + + final List expected = Arrays.asList("0 3 1 2","0 0 0 5","impossible"); + + assertThat(actual, is(expected)); + } + + @Test + public void 途中の人が購入不可() { + + final int[] coins = {0,5,1,10}; + final List> customers = Arrays.asList(Arrays.asList(130,1,0,0,0),Arrays.asList(150,1,0,1,0),Arrays.asList(170,0,2,0,0)); + + final InputData inputData = new InputData(coins,3,customers); + final Result result = B026.solveChange(inputData); + List actual = result.getChange(); + + final List expected = Arrays.asList("0 3 1 2","impossible","0 0 0 3"); + + assertThat(actual, is(expected)); + } + + @Test + public void 最初の人が購入不可() { + + final int[] coins = {0,3,1,3}; + final List> customers = Arrays.asList(Arrays.asList(110,0,1,1,0),Arrays.asList(130,0,1,1,0),Arrays.asList(160,0,2,0,1)); + + final InputData inputData = new InputData(coins,3,customers); + final Result result = B026.solveChange(inputData); + List actual = result.getChange(); + + final List expected = Arrays.asList("impossible","0 0 0 2","0 0 1 0"); + + assertThat(actual, is(expected)); + } + + @Test + public void おつりが0円を含む() { + + final int[] coins = {0,0,0,2}; + final List> customers = Arrays.asList(Arrays.asList(110,0,1,0,1),Arrays.asList(120,0,1,1,0),Arrays.asList(150,0,1,1,0)); + + final InputData inputData = new InputData(coins,3,customers); + final Result result = B026.solveChange(inputData); + List actual = result.getChange(); + + final List expected = Arrays.asList("0 0 0 0","0 0 0 3","0 0 0 0"); + + assertThat(actual, is(expected)); + } + + @Test + public void 自販機内の硬貨がすべて0のとき() { + + final int[] coins = {0,0,0,0}; + final List> customers = Arrays.asList(Arrays.asList(110,0,2,0,0),Arrays.asList(130,0,1,1,0)); + + final InputData inputData = new InputData(coins,2,customers); + final Result result = B026.solveChange(inputData); + List actual = result.getChange(); + + final List expected = Arrays.asList("impossible","impossible"); + + assertThat(actual, is(expected)); + } + +} -- GitLab From 38db50ac6d1f1877cf81d87f37648740cf2557de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Wed, 21 Aug 2024 11:08:20 +0900 Subject: [PATCH 08/12] =?UTF-8?q?paiza=E3=81=AEB026=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B026.java | 141 +++++++--------------------------- sitou/src/Customer.java | 31 +++----- sitou/src/InputData.java | 28 ------- sitou/src/Result.java | 2 +- sitou/src/VendingMachine.java | 106 +++++++++++++++++++++++-- sitou/test/B026_Test.java | 109 +++++++++++++------------- 6 files changed, 191 insertions(+), 226 deletions(-) delete mode 100644 sitou/src/InputData.java diff --git a/sitou/src/B026.java b/sitou/src/B026.java index b069b56..a81e925 100644 --- a/sitou/src/B026.java +++ b/sitou/src/B026.java @@ -1,28 +1,22 @@ package src; +import java.io.InputStream; +import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class B026 { - public static void main(String[] args) { - execute(); - } - static void execute() { - final InputData inputData = input(); - final Result result = solveChange(inputData); - output(inputData, result); - } + private static final int[] coinsInMachine = new int[4]; + private static int numOfCustomer; + private static final List> customers = new ArrayList<>(); - private static InputData input() { - final Scanner scan = new Scanner(System.in); - final int[] coinsInMachine = new int[4]; - final int numOfCustomer; - final List> customers = new ArrayList<>(); + public B026(InputStream in, PrintStream out) { + final Scanner scan = new Scanner(in); try { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < coinsInMachine.length; i++) { coinsInMachine[i] = scan.nextInt(); } numOfCustomer = scan.nextInt(); @@ -36,115 +30,34 @@ public class B026 { } finally { scan.close(); } - - return new InputData(coinsInMachine, numOfCustomer, customers); + System.setOut(out); } - public static Result solveChange(InputData inputData) { - final List result = new ArrayList<>(); - VendingMachine vm = new VendingMachine(inputData.getCoinsInMachine()); - - for (int n = 0; n < inputData.getNumOfCustomer(); n++) { - final Customer c = new Customer(inputData.getCustomer(n)); - - result.add(calculateChange(vm, c)); - } - return new Result(result); + public static void main(String[] args) { + final B026 sut = new B026(System.in, System.out); + sut.execute(); } - static String calculateChange(final VendingMachine vm, final Customer customer) { - String s = ""; - final int[] coinsOfChange = {0, 0, 0, 0}; - final int[] first = {vm.getCoins()[0],vm.getCoins()[1],vm.getCoins()[2],vm.getCoins()[3]}; - final int[] coinsInMachine = vm.getCoins(); - final int change = customer.getSumOfMoney() - customer.getDrinkPrice(); - - if (canChange(change,coinsInMachine,coinsOfChange)) { - //おつりを排出できるとき硬貨の枚数を出力 - for (int i = 0; i < 4; i++) { - coinsInMachine[i] += customer.getCoin().get(i); - } - - s = coinsOfChange[0] - + " " - + coinsOfChange[1] - + " " - + coinsOfChange[2] - + " " - + coinsOfChange[3]; - - } else { - //できないときは自販機の硬貨の枚数を計算前に戻す - s = "impossible"; - coinsInMachine[0] = first[0]; - coinsInMachine[1] = first[1]; - coinsInMachine[2] = first[2]; - coinsInMachine[3] = first[3]; - } - - return s; + public void execute() { + final Result result = solveChange(); + output(result); } - static boolean canChange(int change, int[] coinsInMachine, int[] coinsOfChange) { - while (change >0) { - if (change - 500 >= 0) { - - if (coinsInMachine[0] > 0) { - coinsOfChange[0]++; - coinsInMachine[0]--; - } else if (coinsInMachine[1] >= 5) { - coinsOfChange[1] += 5; - coinsInMachine[1] -= 5; - } else { - return false; - } - change -= 500; - continue; - - } else if (change - 100 >= 0) { - - if (coinsInMachine[1] > 0) { - coinsOfChange[1]++; - coinsInMachine[1]--; - } else { - return false; - } - change -= 100; - continue; - - } else if (change - 50 >= 0) { - - if (coinsInMachine[2] > 0) { - coinsOfChange[2]++; - coinsInMachine[2]--; - } else if (coinsInMachine[3] >= 5) { - coinsOfChange[3] += 5; - coinsInMachine[3] -= 5; - } else { - return false; - } - change -= 50; - continue; - - } else if (change - 10 >= 0) { - - if (coinsInMachine[3] > 0) { - coinsOfChange[3]++; - coinsInMachine[3]--; - } else { - return false; - } - change -= 10; - continue; - - } + public static Result solveChange() { + final List result = new ArrayList<>(); + VendingMachine vm = new VendingMachine(coinsInMachine); + + for (int n = 0; n < numOfCustomer; n++) { + // 客ひとりひとりの + // 購入しようとした結果を格納 + final Customer c = new Customer(customers.get(n)); + result.add(c.buy(vm)); } - - return true; + return new Result(result); } - private static void output(final InputData inputData, final Result result) { - for (int i = 0; i < inputData.getNumOfCustomer(); i++) { + private static void output(final Result result) { + for (int i = 0; i < result.getChange().size(); i++) { System.out.println(result.getChange().get(i)); } } diff --git a/sitou/src/Customer.java b/sitou/src/Customer.java index e3e6f5f..0faf57b 100644 --- a/sitou/src/Customer.java +++ b/sitou/src/Customer.java @@ -1,34 +1,21 @@ package src; -import java.util.ArrayList; import java.util.List; public class Customer { private final int drinkPrice; - private final List coin = new ArrayList<>(); - private final int sumOfMoney; - - Customer(List customer){ + private final int[] coins = new int[4]; + + public Customer(List customer) { drinkPrice = customer.get(0); - for(int i = 1; i < 5; i++) { - coin.add(customer.get(i)); + for (int i = 0; i < 4; i++) { + coins[i] = customer.get(i+1); } - int money = 500*coin.get(0); - money += 100*coin.get(1); - money += 50*coin.get(2); - money += 10*coin.get(3); - sumOfMoney = money; - } - - final int getDrinkPrice() { - return drinkPrice; - } - - final List getCoin(){ - return coin; } - final int getSumOfMoney() { - return sumOfMoney; + public String buy(final VendingMachine vm) { + //自動販売機に買いたいモノの値段とコインを渡す。 + //おつりの硬貨の枚数またはimpossibleが返る。 + return vm.sell(drinkPrice, coins); } } diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java deleted file mode 100644 index eb04726..0000000 --- a/sitou/src/InputData.java +++ /dev/null @@ -1,28 +0,0 @@ -package src; - -import java.util.List; - -public class InputData { - private int[] coinsInMachine = new int[4]; - private final int numOfCustomer; - private final List> customers; - - public InputData(final int[] coinsInMachine, int numOfCustomer, final List> customers) { - this.coinsInMachine = coinsInMachine; - this.numOfCustomer = numOfCustomer; - this.customers = customers; - } - - final int[] getCoinsInMachine() { - return coinsInMachine; - } - - final int getNumOfCustomer() { - return numOfCustomer; - } - - final List getCustomer(int n){ - return customers.get(n); - } - -} diff --git a/sitou/src/Result.java b/sitou/src/Result.java index 410c25a..4824803 100644 --- a/sitou/src/Result.java +++ b/sitou/src/Result.java @@ -9,7 +9,7 @@ public class Result { this.change = change; } - public final List getChange() { + public List getChange() { return change; } } diff --git a/sitou/src/VendingMachine.java b/sitou/src/VendingMachine.java index 81a64fb..ac339f9 100644 --- a/sitou/src/VendingMachine.java +++ b/sitou/src/VendingMachine.java @@ -1,13 +1,109 @@ package src; public class VendingMachine { + private static final int _500YEN = 0; + private static final int _100YEN = 1; + private static final int _50YEN = 2; + private static final int _10YEN = 3; private int[] coins = new int[4]; - - VendingMachine(int[] coins) { + + public VendingMachine(int[] coins) { this.coins = coins; } - - final int[] getCoins() { - return coins; + + public String sell(final int price, final int[] receivedCoins) { + final int[] coinsOfChange = { + 0, 0, 0, 0 + }; + final int[] first = { + coins[0], coins[1], coins[2], coins[3] + }; + final int money = 500 * receivedCoins[0] + 100 * receivedCoins[1] + 50 * receivedCoins[2] + 10 * receivedCoins[3]; + final int change = money - price; + + if (canChange(change, coinsOfChange)) { + // おつりを排出できるとき硬貨の枚数を出力 + for (int i = 0; i < 4; i++) { + coins[i] += receivedCoins[i]; + } + return coinsOfChange[0] + + " " + + coinsOfChange[1] + + " " + + coinsOfChange[2] + + " " + + coinsOfChange[3]; + + } else { + // できないときは自販機の硬貨の枚数を計算前に戻す + coins[_500YEN] = first[0]; + coins[_100YEN] = first[1]; + coins[_50YEN] = first[2]; + coins[_10YEN] = first[3]; + return "impossible"; + } + } + + private boolean canChange(final int change, final int[] coinsOfChange) { + int restOfChange = change; + + //100円を出したいときに50,10円の組み合わせでは出さない + //50円を出したいときに10円5枚でも出せる + //同様に500円でもそのような処理にしたが、今回の問題では必要ないかも + while (restOfChange > 0) { + if (restOfChange - 500 >= 0) { + + if (coins[_500YEN] > 0) { + coinsOfChange[0]++; + coins[_500YEN]--; + } else if (coins[_100YEN] >= 5) { + coinsOfChange[1] += 5; + coins[_100YEN] -= 5; + } else { + return false; + } + restOfChange -= 500; + continue; + + } else if (restOfChange - 100 >= 0) { + + if (coins[_100YEN] > 0) { + coinsOfChange[1]++; + coins[_100YEN]--; + } else { + return false; + } + restOfChange -= 100; + continue; + + } else if (restOfChange - 50 >= 0) { + + if (coins[_50YEN] > 0) { + coinsOfChange[2]++; + coins[_50YEN]--; + } else if (coins[_10YEN] >= 5) { + coinsOfChange[3] += 5; + coins[_10YEN] -= 5; + } else { + return false; + } + restOfChange -= 50; + continue; + + } else if (restOfChange - 10 >= 0) { + + if (coins[_10YEN] > 0) { + coinsOfChange[3]++; + coins[_10YEN]--; + } else { + return false; + } + restOfChange -= 10; + continue; + + } + } + + return true; } } diff --git a/sitou/test/B026_Test.java b/sitou/test/B026_Test.java index d1ca6ec..8b4cc00 100644 --- a/sitou/test/B026_Test.java +++ b/sitou/test/B026_Test.java @@ -1,88 +1,85 @@ package test; -import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import src.B026; -import src.InputData; -import src.Result; +import src.Customer; +import src.VendingMachine; public class B026_Test { + @Test - public void 最後の人が購入不可() { - - final int[] coins = {1,4,1,20}; - final List> customers = Arrays.asList(Arrays.asList(130,1,0,0,0),Arrays.asList(150,0,2,0,0),Arrays.asList(100,1,0,0,0)); - - final InputData inputData = new InputData(coins,3,customers); - final Result result = B026.solveChange(inputData); - List actual = result.getChange(); + public void 正しく動くかテスト() { + final InputStream is = new ByteArrayInputStream("1 4 1 20 3 130 1 0 0 0 150 0 2 0 0 100 1 0 0 0".getBytes()); - final List expected = Arrays.asList("0 3 1 2","0 0 0 5","impossible"); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final PrintStream ps = new PrintStream(baos); - assertThat(actual, is(expected)); + final B026 sut = new B026(is, ps); + sut.execute(); + + final String result = baos.toString(); + assertEquals("0 3 1 2" + System.lineSeparator() + + "0 0 0 5" + System.lineSeparator() + + "impossible" + System.lineSeparator(), result); } @Test - public void 途中の人が購入不可() { - - final int[] coins = {0,5,1,10}; + public void impossibleの後に購入できるかテスト() { + final int[] coinsInMachine = {0,5,1,10}; + final int numOfCustomer = 3; final List> customers = Arrays.asList(Arrays.asList(130,1,0,0,0),Arrays.asList(150,1,0,1,0),Arrays.asList(170,0,2,0,0)); - final InputData inputData = new InputData(coins,3,customers); - final Result result = B026.solveChange(inputData); - List actual = result.getChange(); + final List result = new ArrayList<>(); + VendingMachine vm = new VendingMachine(coinsInMachine); - final List expected = Arrays.asList("0 3 1 2","impossible","0 0 0 3"); - - assertThat(actual, is(expected)); - } - - @Test - public void 最初の人が購入不可() { - - final int[] coins = {0,3,1,3}; - final List> customers = Arrays.asList(Arrays.asList(110,0,1,1,0),Arrays.asList(130,0,1,1,0),Arrays.asList(160,0,2,0,1)); + for (int n = 0; n < numOfCustomer; n++) { + final Customer c = new Customer(customers.get(n)); + result.add(c.buy(vm)); + } - final InputData inputData = new InputData(coins,3,customers); - final Result result = B026.solveChange(inputData); - List actual = result.getChange(); - - final List expected = Arrays.asList("impossible","0 0 0 2","0 0 1 0"); - - assertThat(actual, is(expected)); + assertThat(result, is(contains("0 3 1 2","impossible","0 0 0 3"))); } @Test - public void おつりが0円を含む() { - - final int[] coins = {0,0,0,2}; + public void おつりが0円のときを含むテスト() { + final int[] coinsInMachine = {0,0,0,2}; + final int numOfCustomer = 3; final List> customers = Arrays.asList(Arrays.asList(110,0,1,0,1),Arrays.asList(120,0,1,1,0),Arrays.asList(150,0,1,1,0)); - final InputData inputData = new InputData(coins,3,customers); - final Result result = B026.solveChange(inputData); - List actual = result.getChange(); + final List result = new ArrayList<>(); + VendingMachine vm = new VendingMachine(coinsInMachine); - final List expected = Arrays.asList("0 0 0 0","0 0 0 3","0 0 0 0"); - - assertThat(actual, is(expected)); + for (int n = 0; n < numOfCustomer; n++) { + final Customer c = new Customer(customers.get(n)); + result.add(c.buy(vm)); + } + + assertThat(result, is(contains("0 0 0 0","0 0 0 3","0 0 0 0"))); } @Test - public void 自販機内の硬貨がすべて0のとき() { + public void 自動販売機内の硬貨が全て0のときのテスト() { + final int[] coinsInMachine = {0,0,0,0}; + final int numOfCustomer = 2; + final List> customers = Arrays.asList(Arrays.asList(110,0,2,0,0),Arrays.asList(170,1,0,0,0)); - final int[] coins = {0,0,0,0}; - final List> customers = Arrays.asList(Arrays.asList(110,0,2,0,0),Arrays.asList(130,0,1,1,0)); - - final InputData inputData = new InputData(coins,2,customers); - final Result result = B026.solveChange(inputData); - List actual = result.getChange(); - - final List expected = Arrays.asList("impossible","impossible"); + final List result = new ArrayList<>(); + VendingMachine vm = new VendingMachine(coinsInMachine); - assertThat(actual, is(expected)); + for (int n = 0; n < numOfCustomer; n++) { + final Customer c = new Customer(customers.get(n)); + result.add(c.buy(vm)); + } + + assertThat(result, is(contains("impossible","impossible"))); } - } -- GitLab From e892dab139acb4ef7b797b2d4206f0ef0ef2d5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Wed, 21 Aug 2024 14:02:57 +0900 Subject: [PATCH 09/12] =?UTF-8?q?paiza=E3=81=AEB026=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B026.java | 9 +++--- sitou/src/VendingMachine.java | 43 ++++++++++++++-------------- sitou/test/B026_Test.java | 53 ++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/sitou/src/B026.java b/sitou/src/B026.java index a81e925..86c166e 100644 --- a/sitou/src/B026.java +++ b/sitou/src/B026.java @@ -11,6 +11,7 @@ public class B026 { private static final int[] coinsInMachine = new int[4]; private static int numOfCustomer; private static final List> customers = new ArrayList<>(); + private PrintStream out; public B026(InputStream in, PrintStream out) { final Scanner scan = new Scanner(in); @@ -30,7 +31,7 @@ public class B026 { } finally { scan.close(); } - System.setOut(out); + this.out = out; } public static void main(String[] args) { @@ -40,7 +41,7 @@ public class B026 { public void execute() { final Result result = solveChange(); - output(result); + output(result, out); } public static Result solveChange() { @@ -56,9 +57,9 @@ public class B026 { return new Result(result); } - private static void output(final Result result) { + private static void output(final Result result, final PrintStream out) { for (int i = 0; i < result.getChange().size(); i++) { - System.out.println(result.getChange().get(i)); + out.println(result.getChange().get(i)); } } diff --git a/sitou/src/VendingMachine.java b/sitou/src/VendingMachine.java index ac339f9..27f68f3 100644 --- a/sitou/src/VendingMachine.java +++ b/sitou/src/VendingMachine.java @@ -16,48 +16,49 @@ public class VendingMachine { 0, 0, 0, 0 }; final int[] first = { - coins[0], coins[1], coins[2], coins[3] + coins[_500YEN], coins[_100YEN], coins[_50YEN], coins[_10YEN] }; - final int money = 500 * receivedCoins[0] + 100 * receivedCoins[1] + 50 * receivedCoins[2] + 10 * receivedCoins[3]; + final int money = 500 * receivedCoins[_500YEN] + 100 * receivedCoins[_100YEN] + 50 + * receivedCoins[_50YEN] + 10 * receivedCoins[_10YEN]; final int change = money - price; - + if (canChange(change, coinsOfChange)) { // おつりを排出できるとき硬貨の枚数を出力 for (int i = 0; i < 4; i++) { coins[i] += receivedCoins[i]; } - return coinsOfChange[0] + return coinsOfChange[_500YEN] + " " - + coinsOfChange[1] + + coinsOfChange[_100YEN] + " " - + coinsOfChange[2] + + coinsOfChange[_50YEN] + " " - + coinsOfChange[3]; + + coinsOfChange[_10YEN]; } else { // できないときは自販機の硬貨の枚数を計算前に戻す - coins[_500YEN] = first[0]; - coins[_100YEN] = first[1]; - coins[_50YEN] = first[2]; - coins[_10YEN] = first[3]; + coins[_500YEN] = first[_500YEN]; + coins[_100YEN] = first[_100YEN]; + coins[_50YEN] = first[_50YEN]; + coins[_10YEN] = first[_10YEN]; return "impossible"; } } private boolean canChange(final int change, final int[] coinsOfChange) { int restOfChange = change; - - //100円を出したいときに50,10円の組み合わせでは出さない - //50円を出したいときに10円5枚でも出せる - //同様に500円でもそのような処理にしたが、今回の問題では必要ないかも + + // 100円を出したいときに50,10円の組み合わせでは出さない + // 50円を出したいときに10円5枚でも出せる + // 同様に500円でもそのような処理にしたが、今回の問題では必要ないかも while (restOfChange > 0) { if (restOfChange - 500 >= 0) { if (coins[_500YEN] > 0) { - coinsOfChange[0]++; + coinsOfChange[_500YEN]++; coins[_500YEN]--; } else if (coins[_100YEN] >= 5) { - coinsOfChange[1] += 5; + coinsOfChange[_100YEN] += 5; coins[_100YEN] -= 5; } else { return false; @@ -68,7 +69,7 @@ public class VendingMachine { } else if (restOfChange - 100 >= 0) { if (coins[_100YEN] > 0) { - coinsOfChange[1]++; + coinsOfChange[_100YEN]++; coins[_100YEN]--; } else { return false; @@ -79,10 +80,10 @@ public class VendingMachine { } else if (restOfChange - 50 >= 0) { if (coins[_50YEN] > 0) { - coinsOfChange[2]++; + coinsOfChange[_50YEN]++; coins[_50YEN]--; } else if (coins[_10YEN] >= 5) { - coinsOfChange[3] += 5; + coinsOfChange[_10YEN] += 5; coins[_10YEN] -= 5; } else { return false; @@ -93,7 +94,7 @@ public class VendingMachine { } else if (restOfChange - 10 >= 0) { if (coins[_10YEN] > 0) { - coinsOfChange[3]++; + coinsOfChange[_10YEN]++; coins[_10YEN]--; } else { return false; diff --git a/sitou/test/B026_Test.java b/sitou/test/B026_Test.java index 8b4cc00..f711ec2 100644 --- a/sitou/test/B026_Test.java +++ b/sitou/test/B026_Test.java @@ -18,7 +18,11 @@ public class B026_Test { @Test public void 正しく動くかテスト() { - final InputStream is = new ByteArrayInputStream("1 4 1 20 3 130 1 0 0 0 150 0 2 0 0 100 1 0 0 0".getBytes()); + final InputStream is = new ByteArrayInputStream(("1 4 1 20\n" + + "3\n" + + "130 1 0 0 0\n" + + "150 0 2 0 0\n" + + "100 1 0 0 0").getBytes()); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final PrintStream ps = new PrintStream(baos); @@ -31,13 +35,17 @@ public class B026_Test { + "0 0 0 5" + System.lineSeparator() + "impossible" + System.lineSeparator(), result); } - + @Test public void impossibleの後に購入できるかテスト() { - final int[] coinsInMachine = {0,5,1,10}; + final int[] coinsInMachine = { + 0, 5, 1, 10 + }; final int numOfCustomer = 3; - final List> customers = Arrays.asList(Arrays.asList(130,1,0,0,0),Arrays.asList(150,1,0,1,0),Arrays.asList(170,0,2,0,0)); - + final List> customers = Arrays + .asList(Arrays.asList(130, 1, 0, 0, 0), Arrays.asList(150, 1, 0, 1, 0), Arrays + .asList(170, 0, 2, 0, 0)); + final List result = new ArrayList<>(); VendingMachine vm = new VendingMachine(coinsInMachine); @@ -45,16 +53,20 @@ public class B026_Test { final Customer c = new Customer(customers.get(n)); result.add(c.buy(vm)); } - - assertThat(result, is(contains("0 3 1 2","impossible","0 0 0 3"))); + + assertThat(result, is(contains("0 3 1 2", "impossible", "0 0 0 3"))); } - + @Test public void おつりが0円のときを含むテスト() { - final int[] coinsInMachine = {0,0,0,2}; + final int[] coinsInMachine = { + 0, 0, 0, 2 + }; final int numOfCustomer = 3; - final List> customers = Arrays.asList(Arrays.asList(110,0,1,0,1),Arrays.asList(120,0,1,1,0),Arrays.asList(150,0,1,1,0)); - + final List> customers = Arrays + .asList(Arrays.asList(110, 0, 1, 0, 1), Arrays.asList(120, 0, 1, 1, 0), Arrays + .asList(150, 0, 1, 1, 0)); + final List result = new ArrayList<>(); VendingMachine vm = new VendingMachine(coinsInMachine); @@ -62,16 +74,19 @@ public class B026_Test { final Customer c = new Customer(customers.get(n)); result.add(c.buy(vm)); } - - assertThat(result, is(contains("0 0 0 0","0 0 0 3","0 0 0 0"))); + + assertThat(result, is(contains("0 0 0 0", "0 0 0 3", "0 0 0 0"))); } - + @Test public void 自動販売機内の硬貨が全て0のときのテスト() { - final int[] coinsInMachine = {0,0,0,0}; + final int[] coinsInMachine = { + 0, 0, 0, 0 + }; final int numOfCustomer = 2; - final List> customers = Arrays.asList(Arrays.asList(110,0,2,0,0),Arrays.asList(170,1,0,0,0)); - + final List> customers = Arrays + .asList(Arrays.asList(110, 0, 2, 0, 0), Arrays.asList(170, 1, 0, 0, 0)); + final List result = new ArrayList<>(); VendingMachine vm = new VendingMachine(coinsInMachine); @@ -79,7 +94,7 @@ public class B026_Test { final Customer c = new Customer(customers.get(n)); result.add(c.buy(vm)); } - - assertThat(result, is(contains("impossible","impossible"))); + + assertThat(result, is(contains("impossible", "impossible"))); } } -- GitLab From a82d7f20400ce4734db1ac256c5c2c07cc353369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Thu, 22 Aug 2024 10:56:00 +0900 Subject: [PATCH 10/12] =?UTF-8?q?paiza=E3=81=AEB099=E3=81=AE=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B026.java | 66 ------------------ sitou/src/B099.java | 75 ++++++++++++++++++++ sitou/src/Customer.java | 21 ------ sitou/src/Result.java | 15 ---- sitou/src/Route.java | 22 ++++++ sitou/src/VendingMachine.java | 110 ----------------------------- sitou/test/B026_Test.java | 100 --------------------------- sitou/test/B099_Test.java | 126 ++++++++++++++++++++++++++++++++++ 8 files changed, 223 insertions(+), 312 deletions(-) delete mode 100644 sitou/src/B026.java create mode 100644 sitou/src/B099.java delete mode 100644 sitou/src/Customer.java delete mode 100644 sitou/src/Result.java create mode 100644 sitou/src/Route.java delete mode 100644 sitou/src/VendingMachine.java delete mode 100644 sitou/test/B026_Test.java create mode 100644 sitou/test/B099_Test.java diff --git a/sitou/src/B026.java b/sitou/src/B026.java deleted file mode 100644 index 86c166e..0000000 --- a/sitou/src/B026.java +++ /dev/null @@ -1,66 +0,0 @@ -package src; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class B026 { - - private static final int[] coinsInMachine = new int[4]; - private static int numOfCustomer; - private static final List> customers = new ArrayList<>(); - private PrintStream out; - - public B026(InputStream in, PrintStream out) { - final Scanner scan = new Scanner(in); - - try { - for (int i = 0; i < coinsInMachine.length; i++) { - coinsInMachine[i] = scan.nextInt(); - } - numOfCustomer = scan.nextInt(); - for (int i = 0; i < numOfCustomer; i++) { - List list = new ArrayList<>(); - for (int j = 0; j < 5; j++) { - list.add(scan.nextInt()); - } - customers.add(list); - } - } finally { - scan.close(); - } - this.out = out; - } - - public static void main(String[] args) { - final B026 sut = new B026(System.in, System.out); - sut.execute(); - } - - public void execute() { - final Result result = solveChange(); - output(result, out); - } - - public static Result solveChange() { - final List result = new ArrayList<>(); - VendingMachine vm = new VendingMachine(coinsInMachine); - - for (int n = 0; n < numOfCustomer; n++) { - // 客ひとりひとりの - // 購入しようとした結果を格納 - final Customer c = new Customer(customers.get(n)); - result.add(c.buy(vm)); - } - return new Result(result); - } - - private static void output(final Result result, final PrintStream out) { - for (int i = 0; i < result.getChange().size(); i++) { - out.println(result.getChange().get(i)); - } - } - -} diff --git a/sitou/src/B099.java b/sitou/src/B099.java new file mode 100644 index 0000000..9d5d636 --- /dev/null +++ b/sitou/src/B099.java @@ -0,0 +1,75 @@ +package src; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B099 { + private static int routeSize; + private static int dangerousRainfall; + private static final List> rainfallList = new ArrayList<>(); + private PrintStream out; + + public B099(InputStream in, PrintStream out) { + final Scanner scan = new Scanner(in); + + try { + routeSize = scan.nextInt(); + dangerousRainfall = scan.nextInt(); + for (int i = 0; i < routeSize; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < routeSize; j++) { + list.add(scan.nextInt()); + } + rainfallList.add(list); + } + } finally { + scan.close(); + } + this.out = out; + } + + public static void main(String[] args) { + final B099 b099 = new B099(System.in, System.out); + b099.execute(); + } + + public void execute() { + final String result = searchRoute(); + output(result, out); + } + + public static String searchRoute() { + final List possibleRouteNum = new ArrayList<>(); + + for (int i = 0; i < routeSize; i++) { + final List route = new ArrayList<>(); + for (int j = 0; j < routeSize; j++) { + route.add(rainfallList.get(j).get(i)); + } + Route r = new Route(route); + if (r.canAttend(dangerousRainfall)) { + possibleRouteNum.add(i + 1); + } + } + + //通れる道があったか + if (possibleRouteNum.isEmpty()) { + return "wait"; + } else { + String result = ""; + for (Integer n : possibleRouteNum) { + result += n + " "; + } + //最後の空白を削除して返す + return result.substring(0, result.length() - 1); + } + } + + private static void output(final String result, final PrintStream out) { + out.println(result); + } + +} diff --git a/sitou/src/Customer.java b/sitou/src/Customer.java deleted file mode 100644 index 0faf57b..0000000 --- a/sitou/src/Customer.java +++ /dev/null @@ -1,21 +0,0 @@ -package src; - -import java.util.List; - -public class Customer { - private final int drinkPrice; - private final int[] coins = new int[4]; - - public Customer(List customer) { - drinkPrice = customer.get(0); - for (int i = 0; i < 4; i++) { - coins[i] = customer.get(i+1); - } - } - - public String buy(final VendingMachine vm) { - //自動販売機に買いたいモノの値段とコインを渡す。 - //おつりの硬貨の枚数またはimpossibleが返る。 - return vm.sell(drinkPrice, coins); - } -} diff --git a/sitou/src/Result.java b/sitou/src/Result.java deleted file mode 100644 index 4824803..0000000 --- a/sitou/src/Result.java +++ /dev/null @@ -1,15 +0,0 @@ -package src; - -import java.util.List; - -public class Result { - final List change; - - Result(final List change) { - this.change = change; - } - - public List getChange() { - return change; - } -} diff --git a/sitou/src/Route.java b/sitou/src/Route.java new file mode 100644 index 0000000..81ff542 --- /dev/null +++ b/sitou/src/Route.java @@ -0,0 +1,22 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class Route { + private List route = new ArrayList<>(); + + public Route(final List route) { + this.route = route; + } + + public boolean canAttend(final int dangerousRainfall) { + //通れたらtrue、通れなければfalse + for (int rainfall : route) { + if (rainfall >= dangerousRainfall) { + return false; + } + } + return true; + } +} diff --git a/sitou/src/VendingMachine.java b/sitou/src/VendingMachine.java deleted file mode 100644 index 27f68f3..0000000 --- a/sitou/src/VendingMachine.java +++ /dev/null @@ -1,110 +0,0 @@ -package src; - -public class VendingMachine { - private static final int _500YEN = 0; - private static final int _100YEN = 1; - private static final int _50YEN = 2; - private static final int _10YEN = 3; - private int[] coins = new int[4]; - - public VendingMachine(int[] coins) { - this.coins = coins; - } - - public String sell(final int price, final int[] receivedCoins) { - final int[] coinsOfChange = { - 0, 0, 0, 0 - }; - final int[] first = { - coins[_500YEN], coins[_100YEN], coins[_50YEN], coins[_10YEN] - }; - final int money = 500 * receivedCoins[_500YEN] + 100 * receivedCoins[_100YEN] + 50 - * receivedCoins[_50YEN] + 10 * receivedCoins[_10YEN]; - final int change = money - price; - - if (canChange(change, coinsOfChange)) { - // おつりを排出できるとき硬貨の枚数を出力 - for (int i = 0; i < 4; i++) { - coins[i] += receivedCoins[i]; - } - return coinsOfChange[_500YEN] - + " " - + coinsOfChange[_100YEN] - + " " - + coinsOfChange[_50YEN] - + " " - + coinsOfChange[_10YEN]; - - } else { - // できないときは自販機の硬貨の枚数を計算前に戻す - coins[_500YEN] = first[_500YEN]; - coins[_100YEN] = first[_100YEN]; - coins[_50YEN] = first[_50YEN]; - coins[_10YEN] = first[_10YEN]; - return "impossible"; - } - } - - private boolean canChange(final int change, final int[] coinsOfChange) { - int restOfChange = change; - - // 100円を出したいときに50,10円の組み合わせでは出さない - // 50円を出したいときに10円5枚でも出せる - // 同様に500円でもそのような処理にしたが、今回の問題では必要ないかも - while (restOfChange > 0) { - if (restOfChange - 500 >= 0) { - - if (coins[_500YEN] > 0) { - coinsOfChange[_500YEN]++; - coins[_500YEN]--; - } else if (coins[_100YEN] >= 5) { - coinsOfChange[_100YEN] += 5; - coins[_100YEN] -= 5; - } else { - return false; - } - restOfChange -= 500; - continue; - - } else if (restOfChange - 100 >= 0) { - - if (coins[_100YEN] > 0) { - coinsOfChange[_100YEN]++; - coins[_100YEN]--; - } else { - return false; - } - restOfChange -= 100; - continue; - - } else if (restOfChange - 50 >= 0) { - - if (coins[_50YEN] > 0) { - coinsOfChange[_50YEN]++; - coins[_50YEN]--; - } else if (coins[_10YEN] >= 5) { - coinsOfChange[_10YEN] += 5; - coins[_10YEN] -= 5; - } else { - return false; - } - restOfChange -= 50; - continue; - - } else if (restOfChange - 10 >= 0) { - - if (coins[_10YEN] > 0) { - coinsOfChange[_10YEN]++; - coins[_10YEN]--; - } else { - return false; - } - restOfChange -= 10; - continue; - - } - } - - return true; - } -} diff --git a/sitou/test/B026_Test.java b/sitou/test/B026_Test.java deleted file mode 100644 index f711ec2..0000000 --- a/sitou/test/B026_Test.java +++ /dev/null @@ -1,100 +0,0 @@ -package test; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.Test; -import src.B026; -import src.Customer; -import src.VendingMachine; - -public class B026_Test { - - @Test - public void 正しく動くかテスト() { - final InputStream is = new ByteArrayInputStream(("1 4 1 20\n" - + "3\n" - + "130 1 0 0 0\n" - + "150 0 2 0 0\n" - + "100 1 0 0 0").getBytes()); - - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - final PrintStream ps = new PrintStream(baos); - - final B026 sut = new B026(is, ps); - sut.execute(); - - final String result = baos.toString(); - assertEquals("0 3 1 2" + System.lineSeparator() - + "0 0 0 5" + System.lineSeparator() - + "impossible" + System.lineSeparator(), result); - } - - @Test - public void impossibleの後に購入できるかテスト() { - final int[] coinsInMachine = { - 0, 5, 1, 10 - }; - final int numOfCustomer = 3; - final List> customers = Arrays - .asList(Arrays.asList(130, 1, 0, 0, 0), Arrays.asList(150, 1, 0, 1, 0), Arrays - .asList(170, 0, 2, 0, 0)); - - final List result = new ArrayList<>(); - VendingMachine vm = new VendingMachine(coinsInMachine); - - for (int n = 0; n < numOfCustomer; n++) { - final Customer c = new Customer(customers.get(n)); - result.add(c.buy(vm)); - } - - assertThat(result, is(contains("0 3 1 2", "impossible", "0 0 0 3"))); - } - - @Test - public void おつりが0円のときを含むテスト() { - final int[] coinsInMachine = { - 0, 0, 0, 2 - }; - final int numOfCustomer = 3; - final List> customers = Arrays - .asList(Arrays.asList(110, 0, 1, 0, 1), Arrays.asList(120, 0, 1, 1, 0), Arrays - .asList(150, 0, 1, 1, 0)); - - final List result = new ArrayList<>(); - VendingMachine vm = new VendingMachine(coinsInMachine); - - for (int n = 0; n < numOfCustomer; n++) { - final Customer c = new Customer(customers.get(n)); - result.add(c.buy(vm)); - } - - assertThat(result, is(contains("0 0 0 0", "0 0 0 3", "0 0 0 0"))); - } - - @Test - public void 自動販売機内の硬貨が全て0のときのテスト() { - final int[] coinsInMachine = { - 0, 0, 0, 0 - }; - final int numOfCustomer = 2; - final List> customers = Arrays - .asList(Arrays.asList(110, 0, 2, 0, 0), Arrays.asList(170, 1, 0, 0, 0)); - - final List result = new ArrayList<>(); - VendingMachine vm = new VendingMachine(coinsInMachine); - - for (int n = 0; n < numOfCustomer; n++) { - final Customer c = new Customer(customers.get(n)); - result.add(c.buy(vm)); - } - - assertThat(result, is(contains("impossible", "impossible"))); - } -} diff --git a/sitou/test/B099_Test.java b/sitou/test/B099_Test.java new file mode 100644 index 0000000..ec12222 --- /dev/null +++ b/sitou/test/B099_Test.java @@ -0,0 +1,126 @@ +package test; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import src.B099; +import src.Route; + +public class B099_Test { + @Test + public void 正しく動くかテスト() { + final InputStream is = new ByteArrayInputStream(("3 200\n" + + "200 200 20\n" + + "100 20 20\n" + + "500 20 20\n").getBytes()); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final PrintStream ps = new PrintStream(baos); + + final B099 b099 = new B099(is, ps); + b099.execute(); + + final String result = baos.toString(); + assertEquals("3"+ System.lineSeparator(), result); + } + + @Test + public void 全ての道が通れないとき() { + final int routeSize = 3; + final int dangerousRainfall = 100; + final List> rainfallList = Arrays.asList(Arrays.asList(1000,1000,1000),Arrays.asList(1000,1000,1000),Arrays.asList(1000,1000,1000)); + + final List possibleRouteNum = new ArrayList<>(); + for (int i = 0; i < routeSize; i++) { + final List route = new ArrayList<>(); + for (int j = 0; j < routeSize; j++) { + route.add(rainfallList.get(j).get(i)); + } + Route r = new Route(route); + if (r.canAttend(dangerousRainfall)) { + possibleRouteNum.add(i + 1); + } + } + + String result = ""; + if (possibleRouteNum.isEmpty()) { + result = "wait"; + } else { + for (Integer n : possibleRouteNum) { + result += n + " "; + } + result = result.substring(0, result.length() - 1); + } + + assertThat(result, is("wait")); + } + + @Test + public void 全ての道が通れるとき() { + final int routeSize = 3; + final int dangerousRainfall = 50; + final List> rainfallList = Arrays.asList(Arrays.asList(40,40,40),Arrays.asList(40,40,40),Arrays.asList(40,40,40)); + + final List possibleRouteNum = new ArrayList<>(); + for (int i = 0; i < routeSize; i++) { + final List route = new ArrayList<>(); + for (int j = 0; j < routeSize; j++) { + route.add(rainfallList.get(j).get(i)); + } + Route r = new Route(route); + if (r.canAttend(dangerousRainfall)) { + possibleRouteNum.add(i + 1); + } + } + + String result = ""; + if (possibleRouteNum.isEmpty()) { + result = "wait"; + } else { + for (Integer n : possibleRouteNum) { + result += n + " "; + } + result = result.substring(0, result.length() - 1); + } + + assertThat(result, is("1 2 3")); + } + + @Test + public void danregousRainfall境界値() { + final int routeSize = 3; + final int dangerousRainfall = 100; + final List> rainfallList = Arrays.asList(Arrays.asList(99,100,101),Arrays.asList(99,100,101),Arrays.asList(99,100,101)); + + final List possibleRouteNum = new ArrayList<>(); + for (int i = 0; i < routeSize; i++) { + final List route = new ArrayList<>(); + for (int j = 0; j < routeSize; j++) { + route.add(rainfallList.get(j).get(i)); + } + Route r = new Route(route); + if (r.canAttend(dangerousRainfall)) { + possibleRouteNum.add(i + 1); + } + } + + String result = ""; + if (possibleRouteNum.isEmpty()) { + result = "wait"; + } else { + for (Integer n : possibleRouteNum) { + result += n + " "; + } + result = result.substring(0, result.length() - 1); + } + + assertThat(result, is("1")); + } +} -- GitLab From c9fcb2c2a5b1f2281633a22d37cd53c775fe9c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Fri, 23 Aug 2024 11:45:31 +0900 Subject: [PATCH 11/12] =?UTF-8?q?paiza=E3=81=AEB099=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B099.java | 28 ++++++++++++++++++---------- sitou/src/RainfallPoints.java | 21 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 sitou/src/RainfallPoints.java diff --git a/sitou/src/B099.java b/sitou/src/B099.java index 9d5d636..43d0592 100644 --- a/sitou/src/B099.java +++ b/sitou/src/B099.java @@ -9,7 +9,7 @@ import java.util.Scanner; public class B099 { private static int routeSize; private static int dangerousRainfall; - private static final List> rainfallList = new ArrayList<>(); + private static final List rainfallList = new ArrayList<>(); private PrintStream out; public B099(InputStream in, PrintStream out) { @@ -18,12 +18,14 @@ public class B099 { try { routeSize = scan.nextInt(); dangerousRainfall = scan.nextInt(); - for (int i = 0; i < routeSize; i++) { - List list = new ArrayList<>(); - for (int j = 0; j < routeSize; j++) { - list.add(scan.nextInt()); + //ルートごとでなく、ルートのn番目に訪れる場所ごとのリスト + for (int pointNum = 0; pointNum < routeSize; pointNum++) { + List points = new ArrayList<>(); + for (int routeNum = 0; routeNum < routeSize; routeNum++) { + points.add(scan.nextInt()); } - rainfallList.add(list); + RainfallPoints p = new RainfallPoints(points); + rainfallList.add(p.getPoint()); } } finally { scan.close(); @@ -44,14 +46,20 @@ public class B099 { public static String searchRoute() { final List possibleRouteNum = new ArrayList<>(); - for (int i = 0; i < routeSize; i++) { + for (int routeNum = 0; routeNum < routeSize; routeNum++) { final List route = new ArrayList<>(); - for (int j = 0; j < routeSize; j++) { - route.add(rainfallList.get(j).get(i)); + + //ポイント番号ごとにRainfallPointsを呼んでルートを作成 + //routeNumが0のとき、pointNum=0の0番目,pointNum=1の0番目... + //routeNumが1のとき、pointNum=0の1番目,pointNum=1の1番目...と作成 + for (int pointNum = 0; pointNum < routeSize; pointNum++) { + RainfallPoints p = new RainfallPoints((List) rainfallList.get(pointNum)); + route.add(p.getPoint(routeNum)); } + Route r = new Route(route); if (r.canAttend(dangerousRainfall)) { - possibleRouteNum.add(i + 1); + possibleRouteNum.add(routeNum + 1); } } diff --git a/sitou/src/RainfallPoints.java b/sitou/src/RainfallPoints.java new file mode 100644 index 0000000..d70ea87 --- /dev/null +++ b/sitou/src/RainfallPoints.java @@ -0,0 +1,21 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class RainfallPoints { +private List point = new ArrayList<>(); + + + public RainfallPoints(List list) { + point = list; + } + + public Object getPoint(){ + return point; + } + + public int getPoint(int routeNum) { + return point.get(routeNum); + } +} -- GitLab From c5dce71a6143a07755d519754903051b600ea7a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Mon, 26 Aug 2024 10:24:11 +0900 Subject: [PATCH 12/12] =?UTF-8?q?paiza=E3=81=AEB099=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/B099.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sitou/src/B099.java b/sitou/src/B099.java index 43d0592..ea9bae9 100644 --- a/sitou/src/B099.java +++ b/sitou/src/B099.java @@ -9,7 +9,7 @@ import java.util.Scanner; public class B099 { private static int routeSize; private static int dangerousRainfall; - private static final List rainfallList = new ArrayList<>(); + private static final List rainfallList = new ArrayList<>(); private PrintStream out; public B099(InputStream in, PrintStream out) { @@ -25,7 +25,7 @@ public class B099 { points.add(scan.nextInt()); } RainfallPoints p = new RainfallPoints(points); - rainfallList.add(p.getPoint()); + rainfallList.add(p); } } finally { scan.close(); @@ -53,7 +53,7 @@ public class B099 { //routeNumが0のとき、pointNum=0の0番目,pointNum=1の0番目... //routeNumが1のとき、pointNum=0の1番目,pointNum=1の1番目...と作成 for (int pointNum = 0; pointNum < routeSize; pointNum++) { - RainfallPoints p = new RainfallPoints((List) rainfallList.get(pointNum)); + RainfallPoints p = rainfallList.get(pointNum); route.add(p.getPoint(routeNum)); } -- GitLab