From 0421b954c476eb51e681be8bdbebf96a9fe4fa07 Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 15:43:59 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=ED=86=B5=EA=B3=BC=20?= =?UTF-8?q?-=20computer=20version=20=EA=B0=80=EC=A0=B8=EC=98=AC=20?= =?UTF-8?q?=EB=95=8C=20optional=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ src/main/java/nextstep/optional/ComputerStore.java | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d911493a8f..00834eb0d7 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,6 @@ - [x] 요구사항 1 - Optional을 활용해 조건에 따른 반환 - [x] 요구사항 2 - Optional에서 값을 반환 - [x] 요구사항 3 - Optional에서 exception 처리 + - [x] 요구사항 3 - Optional에서 exception 처리 +- 리뷰 + - [x] 전체 테스트 코드 통과 diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 2695c967ac..0c95c286f0 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -3,6 +3,8 @@ import nextstep.optional.Computer.Soundcard; import nextstep.optional.Computer.USB; +import java.util.Optional; + public class ComputerStore { public static final String UNKNOWN_VERSION = "UNKNOWN"; @@ -21,6 +23,10 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - return null; + return Optional.ofNullable(computer) + .map(Computer::getSoundcard) + .map(Soundcard:: getUsb) + .map(USB::getVersion) + .orElse(UNKNOWN_VERSION); } } From b1014addaf846371cb0cb6ece50ff037b904f3c0 Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 15:44:51 +0900 Subject: [PATCH 2/9] =?UTF-8?q?chore:=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/Users.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java index 3d9333b188..63815d1c28 100644 --- a/src/main/java/nextstep/optional/Users.java +++ b/src/main/java/nextstep/optional/Users.java @@ -2,7 +2,6 @@ import java.util.Arrays; import java.util.List; -import java.util.Optional; public class Users { static final User DEFAULT_USER = new User("codesquad", 100); @@ -15,7 +14,7 @@ public class Users { User getUser(String name) { return users.stream() - .filter(user -> user.getName().equals(name)) + .filter(user -> user.matchName(name)) .findFirst() .orElse(DEFAULT_USER); } From 170214048c39649d20071e3bc456dd5083520f89 Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 16:22:23 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++ src/main/java/ladder/domain/Line.java | 36 +++++++++++++++++++++++++++ src/test/java/ladder/LineTest.java | 14 +++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/main/java/ladder/domain/Line.java create mode 100644 src/test/java/ladder/LineTest.java diff --git a/README.md b/README.md index 00834eb0d7..15f5d28bcf 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,8 @@ - [x] 요구사항 3 - Optional에서 exception 처리 - 리뷰 - [x] 전체 테스트 코드 통과 + +### 사다리(생성) +- [x] 라인 길이를 전달받아 사다리 라인을 생성한다. +- [ ] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. +- [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java new file mode 100644 index 0000000000..97b652c55a --- /dev/null +++ b/src/main/java/ladder/domain/Line.java @@ -0,0 +1,36 @@ +package ladder.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Line { + private final List points; + + public Line(List points) { + this.points = points; + } + + public Line(int size) { + this.points = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + this.points.add(Boolean.FALSE); + } + } + + public boolean hasSize(int size) { + return points.size() == size; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Line line = (Line) o; + return Objects.equals(points, line.points); + } + + @Override + public int hashCode() { + return Objects.hashCode(points); + } +} diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java new file mode 100644 index 0000000000..3975b2ab13 --- /dev/null +++ b/src/test/java/ladder/LineTest.java @@ -0,0 +1,14 @@ +package ladder; + +import ladder.domain.Line; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LineTest { + @Test + void createLine() { + Line line = new Line(4); + assertThat(line.hasSize(4)).isTrue(); + } +} From 3e3dfdcbd99c1712a163a2e5ecaceb0f7038cdbd Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 17:13:44 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=EC=9D=B4=20=EC=9D=B4=EC=9B=83=ED=95=9C=20?= =?UTF-8?q?=EA=B3=B3=EA=B3=BC=20=EC=9D=B4=EC=96=B4=EC=A0=B8=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- .../java/ladder/domain/ConnectStrategy.java | 5 +++++ src/main/java/ladder/domain/Line.java | 8 ++------ src/test/java/ladder/LineTest.java | 20 ++++++++++++++++--- 4 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 src/main/java/ladder/domain/ConnectStrategy.java diff --git a/README.md b/README.md index 15f5d28bcf..e84455001d 100644 --- a/README.md +++ b/README.md @@ -26,5 +26,7 @@ ### 사다리(생성) - [x] 라인 길이를 전달받아 사다리 라인을 생성한다. -- [ ] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. +- [x] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. +- [ ] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. +- [ ] 라인의 각 포인트는 오른쪽과 이어져있음을 의미한다. 마지막 포인트는 null 이다. - [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/domain/ConnectStrategy.java b/src/main/java/ladder/domain/ConnectStrategy.java new file mode 100644 index 0000000000..813bf88c2f --- /dev/null +++ b/src/main/java/ladder/domain/ConnectStrategy.java @@ -0,0 +1,5 @@ +package ladder.domain; + +public interface ConnectStrategy { + boolean connect(int idx); +} diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java index 97b652c55a..88aca09619 100644 --- a/src/main/java/ladder/domain/Line.java +++ b/src/main/java/ladder/domain/Line.java @@ -11,17 +11,13 @@ public Line(List points) { this.points = points; } - public Line(int size) { + public Line(int size, ConnectStrategy connectStrategy) { this.points = new ArrayList<>(size); for (int i = 0; i < size; i++) { - this.points.add(Boolean.FALSE); + this.points.add(connectStrategy.connect(i)); } } - public boolean hasSize(int size) { - return points.size() == size; - } - @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java index 3975b2ab13..0265ea3078 100644 --- a/src/test/java/ladder/LineTest.java +++ b/src/test/java/ladder/LineTest.java @@ -3,12 +3,26 @@ import ladder.domain.Line; import org.junit.jupiter.api.Test; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; public class LineTest { @Test - void createLine() { - Line line = new Line(4); - assertThat(line.hasSize(4)).isTrue(); + void 라인_생성() { + Line line = new Line(4, (idx) -> false); + assertThat(line).isEqualTo(new Line(List.of(false, false, false, false))); + } + + @Test + void 처음에만_연결() { + Line line = new Line(4, (idx) -> idx == 0); + assertThat(line).isEqualTo(new Line(List.of(true, false, false, false))); + } + + @Test + void 홀수번째만_연결() { + Line line = new Line(4, (idx) -> idx % 2 != 0); + assertThat(line).isEqualTo(new Line(List.of(false, true, false, true))); } } From dd877b8dd699be9224d76254b0c2e6993411ff6e Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 17:34:39 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=EC=9D=80=20=EC=97=B0=EC=86=8D=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EC=96=B4=EC=A0=B8=EC=9E=88?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=95=84=EC=95=BC=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/ladder/domain/Line.java | 10 ++---- src/main/java/ladder/domain/Points.java | 44 +++++++++++++++++++++++++ src/test/java/ladder/LineTest.java | 6 ++++ 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ladder/domain/Points.java diff --git a/README.md b/README.md index e84455001d..c109809a05 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,6 @@ ### 사다리(생성) - [x] 라인 길이를 전달받아 사다리 라인을 생성한다. - [x] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. -- [ ] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. +- [x] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. - [ ] 라인의 각 포인트는 오른쪽과 이어져있음을 의미한다. 마지막 포인트는 null 이다. - [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java index 88aca09619..fd89f0dd04 100644 --- a/src/main/java/ladder/domain/Line.java +++ b/src/main/java/ladder/domain/Line.java @@ -1,21 +1,17 @@ package ladder.domain; -import java.util.ArrayList; import java.util.List; import java.util.Objects; public class Line { - private final List points; + private final Points points; public Line(List points) { - this.points = points; + this.points = new Points(points); } public Line(int size, ConnectStrategy connectStrategy) { - this.points = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - this.points.add(connectStrategy.connect(i)); - } + this.points = new Points(size, connectStrategy); } @Override diff --git a/src/main/java/ladder/domain/Points.java b/src/main/java/ladder/domain/Points.java new file mode 100644 index 0000000000..50b127921f --- /dev/null +++ b/src/main/java/ladder/domain/Points.java @@ -0,0 +1,44 @@ +package ladder.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.IntStream; + +public class Points { + private final List points; + + public Points(List points) { + this.points = points; + validate(); + } + + public Points(int size, ConnectStrategy connectStrategy) { + this.points = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + points.add(connectStrategy.connect(i)); + } + validate(); + } + + public void validate() { + IntStream.range(0, points.size()-1) + .filter(i -> points.get(i) && points.get(i+1)) + .findFirst() + .ifPresent(i -> { + throw new IllegalArgumentException("각 포인트는 연속적으로 연결될 수 없음"); + }); + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Points points1 = (Points) o; + return Objects.equals(points, points1.points); + } + + @Override + public int hashCode() { + return Objects.hashCode(points); + } +} diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java index 0265ea3078..17931c469b 100644 --- a/src/test/java/ladder/LineTest.java +++ b/src/test/java/ladder/LineTest.java @@ -6,6 +6,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LineTest { @Test @@ -25,4 +26,9 @@ public class LineTest { Line line = new Line(4, (idx) -> idx % 2 != 0); assertThat(line).isEqualTo(new Line(List.of(false, true, false, true))); } + + @Test + void 연속적으로_연결되면_예외() { + assertThatThrownBy(() -> new Line(4, (idx) -> true)).isInstanceOf(IllegalArgumentException.class); + } } From 400b0a9f1d84c8893241c19f9f88268f832e074d Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 19:47:45 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=EB=9D=BC=EC=9D=B8=EC=9D=98=20?= =?UTF-8?q?=EA=B0=81=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=EB=8A=94=20=EC=99=BC?= =?UTF-8?q?=EC=AA=BD/=EC=98=A4=EB=A5=B8=EC=AA=BD=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=9C=A0=EB=AC=B4=EB=A5=BC=20=EA=B0=96=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/ladder/domain/ConnectStrategy.java | 2 +- src/main/java/ladder/domain/Line.java | 2 +- src/main/java/ladder/domain/Point.java | 33 +++++++++++++++++++ src/main/java/ladder/domain/Points.java | 20 ++++++----- src/test/java/ladder/LineTest.java | 20 +++++++---- 6 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 src/main/java/ladder/domain/Point.java diff --git a/README.md b/README.md index c109809a05..e0364dc8cf 100644 --- a/README.md +++ b/README.md @@ -28,5 +28,5 @@ - [x] 라인 길이를 전달받아 사다리 라인을 생성한다. - [x] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. - [x] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. -- [ ] 라인의 각 포인트는 오른쪽과 이어져있음을 의미한다. 마지막 포인트는 null 이다. +- [x] 라인의 각 포인트는 왼쪽/오른쪽 연결 유무를 갖는다. - [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/domain/ConnectStrategy.java b/src/main/java/ladder/domain/ConnectStrategy.java index 813bf88c2f..bc71ef0893 100644 --- a/src/main/java/ladder/domain/ConnectStrategy.java +++ b/src/main/java/ladder/domain/ConnectStrategy.java @@ -1,5 +1,5 @@ package ladder.domain; public interface ConnectStrategy { - boolean connect(int idx); + Point connect(int idx); } diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java index fd89f0dd04..105379782b 100644 --- a/src/main/java/ladder/domain/Line.java +++ b/src/main/java/ladder/domain/Line.java @@ -6,7 +6,7 @@ public class Line { private final Points points; - public Line(List points) { + public Line(List points) { this.points = new Points(points); } diff --git a/src/main/java/ladder/domain/Point.java b/src/main/java/ladder/domain/Point.java new file mode 100644 index 0000000000..ce906bb1f3 --- /dev/null +++ b/src/main/java/ladder/domain/Point.java @@ -0,0 +1,33 @@ +package ladder.domain; + +import java.util.Objects; + +public class Point { + private final boolean leftConnected; + private final boolean rightConnected; + + public Point(boolean leftConnected, boolean rightConnected) { + this.leftConnected = leftConnected; + this.rightConnected = rightConnected; + } + + public boolean leftConnected() { + return leftConnected; + } + + public boolean rightConnected() { + return rightConnected; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return leftConnected == point.leftConnected && rightConnected == point.rightConnected; + } + + @Override + public int hashCode() { + return Objects.hash(leftConnected, rightConnected); + } +} diff --git a/src/main/java/ladder/domain/Points.java b/src/main/java/ladder/domain/Points.java index 50b127921f..2135f6ec36 100644 --- a/src/main/java/ladder/domain/Points.java +++ b/src/main/java/ladder/domain/Points.java @@ -1,35 +1,37 @@ package ladder.domain; -import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import java.util.stream.IntStream; public class Points { - private final List points; + private final List points; - public Points(List points) { + public Points(List points) { this.points = points; validate(); } public Points(int size, ConnectStrategy connectStrategy) { - this.points = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - points.add(connectStrategy.connect(i)); - } - validate(); + this(IntStream.range(0, size) + .mapToObj(connectStrategy::connect) + .collect(Collectors.toList())); } public void validate() { IntStream.range(0, points.size()-1) - .filter(i -> points.get(i) && points.get(i+1)) + .filter(this::continuousConnected) .findFirst() .ifPresent(i -> { throw new IllegalArgumentException("각 포인트는 연속적으로 연결될 수 없음"); }); } + private boolean continuousConnected(int idx) { + return points.get(idx).rightConnected() && points.get(idx+1).rightConnected(); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java index 17931c469b..2ec1c21f10 100644 --- a/src/test/java/ladder/LineTest.java +++ b/src/test/java/ladder/LineTest.java @@ -1,6 +1,7 @@ package ladder; import ladder.domain.Line; +import ladder.domain.Point; import org.junit.jupiter.api.Test; import java.util.List; @@ -9,26 +10,31 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LineTest { + Point notConnected = new Point(false, false); + Point connectOnlyLeft = new Point(true, false); + Point connectOnlyRight = new Point(false, true); + Point connectAll = new Point(true, true); + @Test void 라인_생성() { - Line line = new Line(4, (idx) -> false); - assertThat(line).isEqualTo(new Line(List.of(false, false, false, false))); + Line line = new Line(4, (idx) -> notConnected); + assertThat(line).isEqualTo(new Line(List.of(notConnected, notConnected, notConnected, notConnected))); } @Test void 처음에만_연결() { - Line line = new Line(4, (idx) -> idx == 0); - assertThat(line).isEqualTo(new Line(List.of(true, false, false, false))); + Line line = new Line(4, (idx) -> idx == 0 ? connectOnlyRight : notConnected); + assertThat(line).isEqualTo(new Line(List.of(connectOnlyRight, notConnected, notConnected, notConnected))); } @Test void 홀수번째만_연결() { - Line line = new Line(4, (idx) -> idx % 2 != 0); - assertThat(line).isEqualTo(new Line(List.of(false, true, false, true))); + Line line = new Line(4, (idx) -> idx % 2 != 0 ? connectAll : notConnected); + assertThat(line).isEqualTo(new Line(List.of(notConnected, connectAll, notConnected, connectAll))); } @Test void 연속적으로_연결되면_예외() { - assertThatThrownBy(() -> new Line(4, (idx) -> true)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Line(4, (idx) -> connectAll)).isInstanceOf(IllegalArgumentException.class); } } From 76cac9c39d35f4f42eeeab2142709c7f9567f42f Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 20:27:12 +0900 Subject: [PATCH 7/9] =?UTF-8?q?refactor:=20=EB=9D=BC=EC=9D=B8=EC=9D=98=20?= =?UTF-8?q?=EA=B0=81=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=B8=EC=AA=BD=20=EC=97=B0=EA=B2=B0=20=EC=9C=A0=EB=AC=B4?= =?UTF-8?q?=EB=A7=8C=20=EA=B0=96=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- .../java/ladder/domain/ConnectStrategy.java | 2 +- src/main/java/ladder/domain/Point.java | 12 +++++------- src/main/java/ladder/domain/Points.java | 2 +- src/test/java/ladder/LineTest.java | 18 ++++++++---------- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index e0364dc8cf..c10429ceae 100644 --- a/README.md +++ b/README.md @@ -28,5 +28,6 @@ - [x] 라인 길이를 전달받아 사다리 라인을 생성한다. - [x] 각 사다리 라인은 이웃한 곳과 이어져있을 수 있다. - [x] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. -- [x] 라인의 각 포인트는 왼쪽/오른쪽 연결 유무를 갖는다. +- ~~[x] 라인의 각 포인트는 왼쪽/오른쪽 연결 유무를 갖는다.~~ +- [x] 라인의 각 포인트는 오른쪽 연결 유무만 갖는다. - [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/domain/ConnectStrategy.java b/src/main/java/ladder/domain/ConnectStrategy.java index bc71ef0893..813bf88c2f 100644 --- a/src/main/java/ladder/domain/ConnectStrategy.java +++ b/src/main/java/ladder/domain/ConnectStrategy.java @@ -1,5 +1,5 @@ package ladder.domain; public interface ConnectStrategy { - Point connect(int idx); + boolean connect(int idx); } diff --git a/src/main/java/ladder/domain/Point.java b/src/main/java/ladder/domain/Point.java index ce906bb1f3..369ad7a24a 100644 --- a/src/main/java/ladder/domain/Point.java +++ b/src/main/java/ladder/domain/Point.java @@ -3,16 +3,14 @@ import java.util.Objects; public class Point { - private final boolean leftConnected; private final boolean rightConnected; - public Point(boolean leftConnected, boolean rightConnected) { - this.leftConnected = leftConnected; + public Point(boolean rightConnected) { this.rightConnected = rightConnected; } - public boolean leftConnected() { - return leftConnected; + public Point(ConnectStrategy connectStrategy, int idx) { + this(connectStrategy.connect(idx)); } public boolean rightConnected() { @@ -23,11 +21,11 @@ public boolean rightConnected() { public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; - return leftConnected == point.leftConnected && rightConnected == point.rightConnected; + return rightConnected == point.rightConnected; } @Override public int hashCode() { - return Objects.hash(leftConnected, rightConnected); + return Objects.hashCode(rightConnected); } } diff --git a/src/main/java/ladder/domain/Points.java b/src/main/java/ladder/domain/Points.java index 2135f6ec36..0cdf302aee 100644 --- a/src/main/java/ladder/domain/Points.java +++ b/src/main/java/ladder/domain/Points.java @@ -15,7 +15,7 @@ public Points(List points) { public Points(int size, ConnectStrategy connectStrategy) { this(IntStream.range(0, size) - .mapToObj(connectStrategy::connect) + .mapToObj(i -> new Point(connectStrategy, i)) .collect(Collectors.toList())); } diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java index 2ec1c21f10..ed1809e17e 100644 --- a/src/test/java/ladder/LineTest.java +++ b/src/test/java/ladder/LineTest.java @@ -10,31 +10,29 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LineTest { - Point notConnected = new Point(false, false); - Point connectOnlyLeft = new Point(true, false); - Point connectOnlyRight = new Point(false, true); - Point connectAll = new Point(true, true); + Point notConnected = new Point(false); + Point connected = new Point(true); @Test void 라인_생성() { - Line line = new Line(4, (idx) -> notConnected); + Line line = new Line(4, (idx) -> false); assertThat(line).isEqualTo(new Line(List.of(notConnected, notConnected, notConnected, notConnected))); } @Test void 처음에만_연결() { - Line line = new Line(4, (idx) -> idx == 0 ? connectOnlyRight : notConnected); - assertThat(line).isEqualTo(new Line(List.of(connectOnlyRight, notConnected, notConnected, notConnected))); + Line line = new Line(4, (idx) -> idx == 0); + assertThat(line).isEqualTo(new Line(List.of(connected, notConnected, notConnected, notConnected))); } @Test void 홀수번째만_연결() { - Line line = new Line(4, (idx) -> idx % 2 != 0 ? connectAll : notConnected); - assertThat(line).isEqualTo(new Line(List.of(notConnected, connectAll, notConnected, connectAll))); + Line line = new Line(4, (idx) -> idx % 2 != 0); + assertThat(line).isEqualTo(new Line(List.of(notConnected, connected, notConnected, connected))); } @Test void 연속적으로_연결되면_예외() { - assertThatThrownBy(() -> new Line(4, (idx) -> connectAll)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Line(4, (idx) -> true)).isInstanceOf(IllegalArgumentException.class); } } From 348199e7d9c4125b50bc46566e4ed74329a45568 Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 21:13:13 +0900 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=84=20=EC=A0=84=EB=8B=AC=EB=B0=9B?= =?UTF-8?q?=EC=95=84=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=ED=9B=84=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/ladder/Main.java | 21 +++++++++++++++ .../java/ladder/domain/ConnectStrategy.java | 2 +- src/main/java/ladder/domain/Ladder.java | 19 +++++++++++++ src/main/java/ladder/domain/Line.java | 4 +++ src/main/java/ladder/domain/People.java | 20 ++++++++++++++ src/main/java/ladder/domain/Point.java | 6 +---- src/main/java/ladder/domain/Points.java | 19 +++++++++---- src/main/java/ladder/view/InputView.java | 19 +++++++++++++ src/main/java/ladder/view/ResultView.java | 27 +++++++++++++++++++ src/test/java/ladder/LineTest.java | 8 +++--- 11 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 src/main/java/ladder/Main.java create mode 100644 src/main/java/ladder/domain/Ladder.java create mode 100644 src/main/java/ladder/domain/People.java create mode 100644 src/main/java/ladder/view/InputView.java create mode 100644 src/main/java/ladder/view/ResultView.java diff --git a/README.md b/README.md index c10429ceae..041ca1a46d 100644 --- a/README.md +++ b/README.md @@ -30,4 +30,4 @@ - [x] 각 사다리 라인은 겹치지 않게 이어져 있어야 한다. - ~~[x] 라인의 각 포인트는 왼쪽/오른쪽 연결 유무를 갖는다.~~ - [x] 라인의 각 포인트는 오른쪽 연결 유무만 갖는다. -- [ ] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. +- [x] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. diff --git a/src/main/java/ladder/Main.java b/src/main/java/ladder/Main.java new file mode 100644 index 0000000000..1b785cee33 --- /dev/null +++ b/src/main/java/ladder/Main.java @@ -0,0 +1,21 @@ +package ladder; + +import ladder.domain.Ladder; +import ladder.domain.People; +import ladder.view.InputView; +import ladder.view.ResultView; + +import java.util.Random; + +public class Main { + private static void makeLadder() { + People people = InputView.inputPeople(); + int ladderHeight = InputView.inputLadderHeight(); + Ladder ladder = new Ladder(ladderHeight, people, (idx, preConnected) -> !preConnected && new Random().nextBoolean()); + ResultView.printLadder(people, ladder); + } + + public static void main(String[] args) { + makeLadder(); + } +} diff --git a/src/main/java/ladder/domain/ConnectStrategy.java b/src/main/java/ladder/domain/ConnectStrategy.java index 813bf88c2f..2baea24625 100644 --- a/src/main/java/ladder/domain/ConnectStrategy.java +++ b/src/main/java/ladder/domain/ConnectStrategy.java @@ -1,5 +1,5 @@ package ladder.domain; public interface ConnectStrategy { - boolean connect(int idx); + boolean connect(int idx, boolean preConnected); } diff --git a/src/main/java/ladder/domain/Ladder.java b/src/main/java/ladder/domain/Ladder.java new file mode 100644 index 0000000000..3be2ae133f --- /dev/null +++ b/src/main/java/ladder/domain/Ladder.java @@ -0,0 +1,19 @@ +package ladder.domain; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Ladder { + private final List lines; + + public Ladder(int height, People people, ConnectStrategy connectStrategy) { + this.lines = IntStream.range(0, height) + .mapToObj(i -> new Line(people.size(), connectStrategy)) + .collect(Collectors.toList()); + } + + public List lines() { + return lines; + } +} diff --git a/src/main/java/ladder/domain/Line.java b/src/main/java/ladder/domain/Line.java index 105379782b..354c2ffd01 100644 --- a/src/main/java/ladder/domain/Line.java +++ b/src/main/java/ladder/domain/Line.java @@ -14,6 +14,10 @@ public Line(int size, ConnectStrategy connectStrategy) { this.points = new Points(size, connectStrategy); } + public Points points() { + return points; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/src/main/java/ladder/domain/People.java b/src/main/java/ladder/domain/People.java new file mode 100644 index 0000000000..955ad41d29 --- /dev/null +++ b/src/main/java/ladder/domain/People.java @@ -0,0 +1,20 @@ +package ladder.domain; + +import java.util.List; + +public class People { + private final static String DELIMITER = ","; + private final List people; + + public People(String input) { + this.people = List.of(input.split(DELIMITER)); + } + + public int size() { + return people.size(); + } + + public List values() { + return people; + } +} diff --git a/src/main/java/ladder/domain/Point.java b/src/main/java/ladder/domain/Point.java index 369ad7a24a..21e0f78161 100644 --- a/src/main/java/ladder/domain/Point.java +++ b/src/main/java/ladder/domain/Point.java @@ -9,11 +9,7 @@ public Point(boolean rightConnected) { this.rightConnected = rightConnected; } - public Point(ConnectStrategy connectStrategy, int idx) { - this(connectStrategy.connect(idx)); - } - - public boolean rightConnected() { + public boolean connected() { return rightConnected; } diff --git a/src/main/java/ladder/domain/Points.java b/src/main/java/ladder/domain/Points.java index 0cdf302aee..b8519e01f8 100644 --- a/src/main/java/ladder/domain/Points.java +++ b/src/main/java/ladder/domain/Points.java @@ -1,8 +1,8 @@ package ladder.domain; +import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.IntStream; public class Points { @@ -14,9 +14,18 @@ public Points(List points) { } public Points(int size, ConnectStrategy connectStrategy) { - this(IntStream.range(0, size) - .mapToObj(i -> new Point(connectStrategy, i)) - .collect(Collectors.toList())); + this(generatePoints(size, connectStrategy)); + } + + public List values() { + return points; + } + + private static List generatePoints(int size, ConnectStrategy connectStrategy) { + List points = new ArrayList<>(size); + IntStream.range(0, size) + .forEach(i -> points.add(new Point(connectStrategy.connect(i, i != 0 && points.get(i - 1).connected())))); + return points; } public void validate() { @@ -29,7 +38,7 @@ public void validate() { } private boolean continuousConnected(int idx) { - return points.get(idx).rightConnected() && points.get(idx+1).rightConnected(); + return points.get(idx).connected() && points.get(idx+1).connected(); } @Override diff --git a/src/main/java/ladder/view/InputView.java b/src/main/java/ladder/view/InputView.java new file mode 100644 index 0000000000..e32054c96b --- /dev/null +++ b/src/main/java/ladder/view/InputView.java @@ -0,0 +1,19 @@ +package ladder.view; + +import ladder.domain.People; + +import java.util.Scanner; + +public class InputView { + private final static Scanner scanner = new Scanner(System.in); + + public static People inputPeople() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + return new People(scanner.nextLine()); + } + + public static int inputLadderHeight() { + System.out.println("최대 사다리 높이는 몇인가요?"); + return scanner.nextInt(); + } +} diff --git a/src/main/java/ladder/view/ResultView.java b/src/main/java/ladder/view/ResultView.java new file mode 100644 index 0000000000..f32dbe9fb0 --- /dev/null +++ b/src/main/java/ladder/view/ResultView.java @@ -0,0 +1,27 @@ +package ladder.view; + +import ladder.domain.Ladder; +import ladder.domain.People; + +public class ResultView { + public static void printLadder(People people, Ladder ladder) { + System.out.println("실행결과"); + printPeople(people); + printLadder(ladder); + } + + private static void printPeople(People people) { + people.values().forEach(v -> System.out.printf("%-6s", v)); + System.out.println(); + } + + private static void printLadder(Ladder ladder) { + ladder.lines().forEach(l -> { + l.points().values().forEach(p -> { + System.out.print("|"); + System.out.printf("%5s", p.connected() ? "-----" : ""); + }); + System.out.println(); + }); + } +} diff --git a/src/test/java/ladder/LineTest.java b/src/test/java/ladder/LineTest.java index ed1809e17e..07636a1dd1 100644 --- a/src/test/java/ladder/LineTest.java +++ b/src/test/java/ladder/LineTest.java @@ -15,24 +15,24 @@ public class LineTest { @Test void 라인_생성() { - Line line = new Line(4, (idx) -> false); + Line line = new Line(4, (idx, preConnected) -> false); assertThat(line).isEqualTo(new Line(List.of(notConnected, notConnected, notConnected, notConnected))); } @Test void 처음에만_연결() { - Line line = new Line(4, (idx) -> idx == 0); + Line line = new Line(4, (idx, preConnected) -> idx == 0); assertThat(line).isEqualTo(new Line(List.of(connected, notConnected, notConnected, notConnected))); } @Test void 홀수번째만_연결() { - Line line = new Line(4, (idx) -> idx % 2 != 0); + Line line = new Line(4, (idx, preConnected) -> idx % 2 != 0); assertThat(line).isEqualTo(new Line(List.of(notConnected, connected, notConnected, connected))); } @Test void 연속적으로_연결되면_예외() { - assertThatThrownBy(() -> new Line(4, (idx) -> true)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Line(4, (idx, preConnected) -> true)).isInstanceOf(IllegalArgumentException.class); } } From 7c642d476449fea977272d2ea7c806dc6e407c74 Mon Sep 17 00:00:00 2001 From: "finn.h" Date: Sat, 5 Apr 2025 21:34:53 +0900 Subject: [PATCH 9/9] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B8=B8=EC=9D=B4=EB=8A=94=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=205=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/ladder/domain/People.java | 11 ++++++++--- src/main/java/ladder/domain/Person.java | 18 ++++++++++++++++++ src/main/java/ladder/view/ResultView.java | 2 +- src/test/java/ladder/PeopleTest.java | 13 +++++++++++++ 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ladder/domain/Person.java create mode 100644 src/test/java/ladder/PeopleTest.java diff --git a/README.md b/README.md index 041ca1a46d..fbf72b82f0 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,4 @@ - ~~[x] 라인의 각 포인트는 왼쪽/오른쪽 연결 유무를 갖는다.~~ - [x] 라인의 각 포인트는 오른쪽 연결 유무만 갖는다. - [x] 사다리 높이와 라인 길이를 전달받아 사다리를 생성한다. +- [x] 사람 이름은 최대 5글자까지만 가능하다. diff --git a/src/main/java/ladder/domain/People.java b/src/main/java/ladder/domain/People.java index 955ad41d29..6ba508cb08 100644 --- a/src/main/java/ladder/domain/People.java +++ b/src/main/java/ladder/domain/People.java @@ -1,20 +1,25 @@ package ladder.domain; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class People { private final static String DELIMITER = ","; - private final List people; + + private final List people; public People(String input) { - this.people = List.of(input.split(DELIMITER)); + this.people = Arrays.stream(input.split(DELIMITER)) + .map(Person::new) + .collect(Collectors.toList()); } public int size() { return people.size(); } - public List values() { + public List values() { return people; } } diff --git a/src/main/java/ladder/domain/Person.java b/src/main/java/ladder/domain/Person.java new file mode 100644 index 0000000000..55002fc6fd --- /dev/null +++ b/src/main/java/ladder/domain/Person.java @@ -0,0 +1,18 @@ +package ladder.domain; + +public class Person { + private static final int NAME_MAX_LENGTH = 5; + + private final String name; + + public Person(String name) { + if (name.length() > 5) { + throw new IllegalArgumentException("이름 길이는 최대 " + NAME_MAX_LENGTH + "자입니다."); + } + this.name = name; + } + + public String name() { + return name; + } +} diff --git a/src/main/java/ladder/view/ResultView.java b/src/main/java/ladder/view/ResultView.java index f32dbe9fb0..81fec2f393 100644 --- a/src/main/java/ladder/view/ResultView.java +++ b/src/main/java/ladder/view/ResultView.java @@ -11,7 +11,7 @@ public static void printLadder(People people, Ladder ladder) { } private static void printPeople(People people) { - people.values().forEach(v -> System.out.printf("%-6s", v)); + people.values().forEach(v -> System.out.printf("%-6s", v.name())); System.out.println(); } diff --git a/src/test/java/ladder/PeopleTest.java b/src/test/java/ladder/PeopleTest.java new file mode 100644 index 0000000000..0eaba3742d --- /dev/null +++ b/src/test/java/ladder/PeopleTest.java @@ -0,0 +1,13 @@ +package ladder; + +import ladder.domain.People; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +public class PeopleTest { + @Test + void 이름_길이_예외() { + assertThatThrownBy(() -> new People("finnnnnn,foo")) + .isInstanceOf(IllegalArgumentException.class); + } +}