From ce095b73c2b29d18ff7fc9f5459b189fbf6c90d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=A4=92=20=E8=80=80=E5=B9=B3?= Date: Mon, 25 Jul 2022 10:37:31 +0900 Subject: [PATCH 1/3] =?UTF-8?q?B091=20=E5=B1=B1=E9=A0=82=E3=82=92=E6=8E=A2?= =?UTF-8?q?=E3=81=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ykoiso/src/B091_Peak.java | 74 ++++++++++++++++++++++++++++++++ ykoiso/test/B091_PeakTest.java | 77 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 ykoiso/src/B091_Peak.java create mode 100644 ykoiso/test/B091_PeakTest.java diff --git a/ykoiso/src/B091_Peak.java b/ykoiso/src/B091_Peak.java new file mode 100644 index 0000000..d04f173 --- /dev/null +++ b/ykoiso/src/B091_Peak.java @@ -0,0 +1,74 @@ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +public class B091_Peak { + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + final int range = scan.nextInt(); + // マスの数読み込み + // 配列のが良い + List> elevation = new ArrayList<>(); + for (int i = 0; i < range; i++) { + elevation.add(new ArrayList<>()); + } + // 各標高の読み込み + for (int y = 0; y < range; y++) { + for (int x = 0; x < range; x++) { + int num = scan.nextInt(); + elevation.get(y).add(num); + } + } + // 答え出力用のリスト + List peakList = new ArrayList<>(); + for (int y = 0; y < range; y++) { + for (int x = 0; x < range; x++) { + // 頂上かの判定 + if (isPeak(elevation, range, x, y)) { + peakList.add(elevation.get(y).get(x)); + } + } + } + // 降順ソート + Collections.sort(peakList, Collections.reverseOrder()); + // 答えの出力 + for (int i = 0; i < peakList.size(); i++) { + System.out.println(peakList.get(i)); + } + scan.close(); + } + + // 頂点かどうかの判定 + public static boolean isPeak(final List> elevation, final int range, final int x, + final int y) { + final int target = elevation.get(y).get(x); + // 各辺に面しているかの判定 + // 最大2辺までなので角かつ0でも問題なし + if (y != 0) { + final int targetTop = elevation.get(y - 1).get(x); + if (target <= targetTop) { + return false; + } + } + if (y != range - 1) { + final int targetBottom = elevation.get(y + 1).get(x); + if (target <= targetBottom) { + return false; + } + } + if (x != 0) { + final int targetLeft = elevation.get(y).get(x - 1); + if (target <= targetLeft) { + return false; + } + } + if (x != range - 1) { + final int targetRight = elevation.get(y).get(x + 1); + if (target <= targetRight) { + return false; + } + } + return true; + } +} diff --git a/ykoiso/test/B091_PeakTest.java b/ykoiso/test/B091_PeakTest.java new file mode 100644 index 0000000..369e3c9 --- /dev/null +++ b/ykoiso/test/B091_PeakTest.java @@ -0,0 +1,77 @@ +import static org.junit.Assert.assertThat; +import java.util.ArrayList; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.*; + +public class B091_PeakTest { + List> elevation = new ArrayList<>(); + + @Before + public void setUp() throws Exception { + for (int i = 0; i < 3; i++) { + elevation.add(new ArrayList<>()); + } + } + + @Test + public void 真ん中が頂上であることを判断できる() { + elevation.get(0).add(0); + elevation.get(0).add(0); + elevation.get(0).add(70); + elevation.get(1).add(89); + elevation.get(1).add(90); + elevation.get(1).add(0); + elevation.get(2).add(60); + elevation.get(2).add(75); + elevation.get(2).add(0); + boolean actual = B091_Peak.isPeak(elevation, 3, 1, 1); + assertThat(actual, is(true)); + } + + @Test + public void 隣接マスが同じ高さの時頂上であることを判断されない() { + elevation.get(0).add(0); + elevation.get(0).add(90); + elevation.get(0).add(70); + elevation.get(1).add(89); + elevation.get(1).add(90); + elevation.get(1).add(0); + elevation.get(2).add(60); + elevation.get(2).add(75); + elevation.get(2).add(0); + boolean actual = B091_Peak.isPeak(elevation, 3, 1, 1); + assertThat(actual, is(false)); + } + + @Test + public void 隣接マスがより高い時頂上であることを判断されない() { + elevation.get(0).add(0); + elevation.get(0).add(250); + elevation.get(0).add(70); + elevation.get(1).add(89); + elevation.get(1).add(90); + elevation.get(1).add(0); + elevation.get(2).add(60); + elevation.get(2).add(75); + elevation.get(2).add(0); + boolean actual = B091_Peak.isPeak(elevation, 3, 1, 1); + assertThat(actual, is(false)); + } + + @Test + public void 斜めのマスがより高い時頂上であることを判断できる() { + elevation.get(0).add(999); + elevation.get(0).add(50); + elevation.get(0).add(70); + elevation.get(1).add(89); + elevation.get(1).add(90); + elevation.get(1).add(0); + elevation.get(2).add(60); + elevation.get(2).add(75); + elevation.get(2).add(0); + boolean actual = B091_Peak.isPeak(elevation, 3, 1, 1); + assertThat(actual, is(true)); + } +} -- GitLab From d967b966c682e3fccfaff9d934116e119ea3561f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=A4=92=20=E8=80=80=E5=B9=B3?= Date: Mon, 25 Jul 2022 13:15:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?B091=20=E5=B1=B1=E9=A0=82=E3=82=92=E6=8E=A2?= =?UTF-8?q?=E3=81=9B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ykoiso/src/B091_Peak.java | 4 ++++ ykoiso/test/B091_PeakTest.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ykoiso/src/B091_Peak.java b/ykoiso/src/B091_Peak.java index d04f173..524ec85 100644 --- a/ykoiso/src/B091_Peak.java +++ b/ykoiso/src/B091_Peak.java @@ -45,6 +45,10 @@ public class B091_Peak { final int target = elevation.get(y).get(x); // 各辺に面しているかの判定 // 最大2辺までなので角かつ0でも問題なし + if (x < 0 || x >= range || y < 0 || y >= range) { + System.out.println("入力値に異常があります。"); + throw new IllegalArgumentException(); + } if (y != 0) { final int targetTop = elevation.get(y - 1).get(x); if (target <= targetTop) { diff --git a/ykoiso/test/B091_PeakTest.java b/ykoiso/test/B091_PeakTest.java index 369e3c9..888f80a 100644 --- a/ykoiso/test/B091_PeakTest.java +++ b/ykoiso/test/B091_PeakTest.java @@ -48,7 +48,7 @@ public class B091_PeakTest { @Test public void 隣接マスがより高い時頂上であることを判断されない() { elevation.get(0).add(0); - elevation.get(0).add(250); + elevation.get(0).add(91); elevation.get(0).add(70); elevation.get(1).add(89); elevation.get(1).add(90); @@ -62,7 +62,7 @@ public class B091_PeakTest { @Test public void 斜めのマスがより高い時頂上であることを判断できる() { - elevation.get(0).add(999); + elevation.get(0).add(91); elevation.get(0).add(50); elevation.get(0).add(70); elevation.get(1).add(89); @@ -74,4 +74,11 @@ public class B091_PeakTest { boolean actual = B091_Peak.isPeak(elevation, 3, 1, 1); assertThat(actual, is(true)); } + /* + * @Test(expected = IllegalArgumentException.class) public void + * 座標の引数がマイナスの時IllegalArgumentExceptionを投げる() throws Exception { elevation.get(0).add(91); + * elevation.get(0).add(50); elevation.get(0).add(70); elevation.get(1).add(89); + * elevation.get(1).add(90); elevation.get(1).add(0); elevation.get(2).add(60); + * elevation.get(2).add(75); elevation.get(2).add(0); B091_Peak.isPeak(elevation, 3, -1, 1); } + */ } -- GitLab From a5042d478178f01e945c580783157b3be8924c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=A4=92=20=E8=80=80=E5=B9=B3?= Date: Mon, 25 Jul 2022 13:21:10 +0900 Subject: [PATCH 3/3] =?UTF-8?q?B091=20=E5=B1=B1=E9=A0=82=E3=82=92=E6=8E=A2?= =?UTF-8?q?=E3=81=9B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ykoiso/src/B091_Peak.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ykoiso/src/B091_Peak.java b/ykoiso/src/B091_Peak.java index 524ec85..8a7706b 100644 --- a/ykoiso/src/B091_Peak.java +++ b/ykoiso/src/B091_Peak.java @@ -46,8 +46,7 @@ public class B091_Peak { // 各辺に面しているかの判定 // 最大2辺までなので角かつ0でも問題なし if (x < 0 || x >= range || y < 0 || y >= range) { - System.out.println("入力値に異常があります。"); - throw new IllegalArgumentException(); + throw new IllegalArgumentException("入力値に異常があります。"); } if (y != 0) { final int targetTop = elevation.get(y - 1).get(x); -- GitLab