From 78d3c9e2da05a6a5043caceb32f2e258e7242b87 Mon Sep 17 00:00:00 2001 From: yumble Date: Sat, 9 Dec 2023 12:50:56 +0900 Subject: [PATCH 1/8] =?UTF-8?q?docs:=20step2=20Readme=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac758abe3b..203bf2807d 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,13 @@ * map(String::toLowerCase) 적용 -> forEach(System.out::println) 으로 출 * [X] Optional 실습 1 : Optional을 활용해 조건에 따른 반환 * [X] Optional 실습 2 : Optional에서 값을 반환 -* [X] Optional 실습 3 : Optional에서 exception 처리 \ No newline at end of file +* [X] Optional 실습 3 : Optional에서 exception 처리 + +# STEP 2 +* [ ] 참여할 사람 명단 입력받기 + * [ ] 쉼표 구분자를 파싱하기 +* [ ] 최대 사다리 높이 입력받기 +* [ ] 실행결과 출력하기 +* [ ] 사다리 만들기 + * [ ] 사다리 한 줄 만들기 + * [ ] 사디리 한 줄의 다리 놓을지 말지 여부 결정하기 \ No newline at end of file From 844fcd32e778f80bc97cbefc8b80790870e54735 Mon Sep 17 00:00:00 2001 From: yumble Date: Sat, 9 Dec 2023 12:57:46 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=8B=A4=EB=A6=AC=20=EA=B5=AC=EC=84=B1=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- .../java/nextstep/ladder/domain/Bridge.java | 13 +++++++++++ .../nextstep/ladder/domain/BridgeTest.java | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/main/java/nextstep/ladder/domain/Bridge.java create mode 100644 src/test/java/nextstep/ladder/domain/BridgeTest.java diff --git a/README.md b/README.md index 203bf2807d..a1e9954c3b 100644 --- a/README.md +++ b/README.md @@ -31,5 +31,6 @@ * [ ] 최대 사다리 높이 입력받기 * [ ] 실행결과 출력하기 * [ ] 사다리 만들기 - * [ ] 사다리 한 줄 만들기 + * [ ] 사다리 한 줄(Line) 만들기 + * [X] 사다리 다리 구성하기 (Bridge) * [ ] 사디리 한 줄의 다리 놓을지 말지 여부 결정하기 \ No newline at end of file diff --git a/src/main/java/nextstep/ladder/domain/Bridge.java b/src/main/java/nextstep/ladder/domain/Bridge.java new file mode 100644 index 0000000000..9d5e233d1d --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Bridge.java @@ -0,0 +1,13 @@ +package nextstep.ladder.domain; + +public class Bridge { + private final boolean value; + + public Bridge(boolean value) { + this.value = value; + } + + public boolean canCrossBridge() { + return value; + } +} diff --git a/src/test/java/nextstep/ladder/domain/BridgeTest.java b/src/test/java/nextstep/ladder/domain/BridgeTest.java new file mode 100644 index 0000000000..fefaeb1098 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/BridgeTest.java @@ -0,0 +1,22 @@ +package nextstep.ladder.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class BridgeTest { + + @Test + public void canCrossBridge_다리_존재_시_True_반환() { + Bridge bridge = new Bridge(true); + + assertThat(bridge.canCrossBridge()).isTrue(); + } + + @Test + public void canCrossBridge_다리_없을_시_False_반환() { + Bridge bridge = new Bridge(false); + + assertThat(bridge.canCrossBridge()).isFalse(); + } +} From 51d63782344aaf8096e5b8e3360ad4dfc0cd1f69 Mon Sep 17 00:00:00 2001 From: yumble Date: Sat, 9 Dec 2023 23:53:01 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=8B=A4=EB=A6=AC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/nextstep/ladder/domain/Bridge.java | 24 ++++++++++++++++++- .../nextstep/ladder/domain/LineGenerator.java | 7 ++++++ .../domain/SequentialRandomLineGenerator.java | 19 +++++++++++++++ .../nextstep/ladder/domain/BridgeTest.java | 4 ++-- .../SequentialRandomLineGeneratorTest.java | 15 ++++++++++++ 6 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 src/main/java/nextstep/ladder/domain/LineGenerator.java create mode 100644 src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java create mode 100644 src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java diff --git a/README.md b/README.md index a1e9954c3b..37e9266efd 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,4 @@ * [ ] 사다리 만들기 * [ ] 사다리 한 줄(Line) 만들기 * [X] 사다리 다리 구성하기 (Bridge) - * [ ] 사디리 한 줄의 다리 놓을지 말지 여부 결정하기 \ No newline at end of file + * [X] 사다리 다리 리스트 구성하기 \ No newline at end of file diff --git a/src/main/java/nextstep/ladder/domain/Bridge.java b/src/main/java/nextstep/ladder/domain/Bridge.java index 9d5e233d1d..a77edb8cc0 100644 --- a/src/main/java/nextstep/ladder/domain/Bridge.java +++ b/src/main/java/nextstep/ladder/domain/Bridge.java @@ -1,13 +1,35 @@ package nextstep.ladder.domain; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; + public class Bridge { private final boolean value; - public Bridge(boolean value) { + private static final Map cacheBridge = new HashMap<>(); + + static { + cacheBridge.put(Boolean.TRUE, new Bridge(true)); + cacheBridge.put(Boolean.FALSE, new Bridge(false)); + } + + private Bridge(boolean value) { this.value = value; } + static Bridge of(boolean value) { + return cacheBridge.get(value); + } + public boolean canCrossBridge() { return value; } + + public Bridge next() { + if (this.value) { + return of(false); + } + return of(ThreadLocalRandom.current().nextBoolean()); + } } diff --git a/src/main/java/nextstep/ladder/domain/LineGenerator.java b/src/main/java/nextstep/ladder/domain/LineGenerator.java new file mode 100644 index 0000000000..049e3bdd19 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/LineGenerator.java @@ -0,0 +1,7 @@ +package nextstep.ladder.domain; + +import java.util.List; + +public interface LineGenerator { + List generateBridges(Integer numbersOfPeople); +} diff --git a/src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java b/src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java new file mode 100644 index 0000000000..88ce1c285c --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java @@ -0,0 +1,19 @@ +package nextstep.ladder.domain; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class SequentialRandomLineGenerator implements LineGenerator{ + + @Override + public List generateBridges(Integer numbersOfPeople) { + List bridges = new LinkedList<>(); + Bridge currentBridge = Bridge.of(ThreadLocalRandom.current().nextBoolean()); + for (int i = 0; i < numbersOfPeople - 1; i++) { + bridges.add(currentBridge); + currentBridge = currentBridge.next(); + } + return bridges; + } +} diff --git a/src/test/java/nextstep/ladder/domain/BridgeTest.java b/src/test/java/nextstep/ladder/domain/BridgeTest.java index fefaeb1098..8d55a27aec 100644 --- a/src/test/java/nextstep/ladder/domain/BridgeTest.java +++ b/src/test/java/nextstep/ladder/domain/BridgeTest.java @@ -8,14 +8,14 @@ public class BridgeTest { @Test public void canCrossBridge_다리_존재_시_True_반환() { - Bridge bridge = new Bridge(true); + Bridge bridge = Bridge.of(true); assertThat(bridge.canCrossBridge()).isTrue(); } @Test public void canCrossBridge_다리_없을_시_False_반환() { - Bridge bridge = new Bridge(false); + Bridge bridge = Bridge.of(false); assertThat(bridge.canCrossBridge()).isFalse(); } diff --git a/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java b/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java new file mode 100644 index 0000000000..991bb5f8a8 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java @@ -0,0 +1,15 @@ +package nextstep.ladder.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class SequentialRandomLineGeneratorTest { + + private final LineGenerator lineGenerator = new SequentialRandomLineGenerator(); + + @Test + public void generateBridges_다리_개수_확인() { + assertThat(lineGenerator.generateBridges(5)).hasSize(4); + } +} From 01128ffc5f33e2d7c6add541d34ee6c03b3199ec Mon Sep 17 00:00:00 2001 From: yumble Date: Sun, 10 Dec 2023 12:54:43 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20Line?= =?UTF-8?q?=20=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../java/nextstep/ladder/domain/Bridge.java | 8 ++++- ...neGenerator.java => BridgesGenerator.java} | 2 +- .../java/nextstep/ladder/domain/Line.java | 32 +++++++++++++++++++ ... => SequentialRandomBridgesGenerator.java} | 11 ++++++- .../SequentialRandomBridgesGeneratorTest.java | 22 +++++++++++++ .../SequentialRandomLineGeneratorTest.java | 15 --------- 7 files changed, 74 insertions(+), 19 deletions(-) rename src/main/java/nextstep/ladder/domain/{LineGenerator.java => BridgesGenerator.java} (76%) create mode 100644 src/main/java/nextstep/ladder/domain/Line.java rename src/main/java/nextstep/ladder/domain/{SequentialRandomLineGenerator.java => SequentialRandomBridgesGenerator.java} (55%) create mode 100644 src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java delete mode 100644 src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java diff --git a/README.md b/README.md index 37e9266efd..6a97960cfe 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ * [ ] 최대 사다리 높이 입력받기 * [ ] 실행결과 출력하기 * [ ] 사다리 만들기 - * [ ] 사다리 한 줄(Line) 만들기 + * [X] 사다리 한 줄(Line) 만들기 * [X] 사다리 다리 구성하기 (Bridge) + * [X] 캐시 전략 사용하기 * [X] 사다리 다리 리스트 구성하기 \ No newline at end of file diff --git a/src/main/java/nextstep/ladder/domain/Bridge.java b/src/main/java/nextstep/ladder/domain/Bridge.java index a77edb8cc0..28102724a8 100644 --- a/src/main/java/nextstep/ladder/domain/Bridge.java +++ b/src/main/java/nextstep/ladder/domain/Bridge.java @@ -22,7 +22,7 @@ static Bridge of(boolean value) { return cacheBridge.get(value); } - public boolean canCrossBridge() { + boolean canCrossBridge() { return value; } @@ -32,4 +32,10 @@ public Bridge next() { } return of(ThreadLocalRandom.current().nextBoolean()); } + + public void compareToNextBridge(Bridge next) { + if (this.value && next.value) { + throw new IllegalArgumentException("연속해서 true인 Bridge가 있습니다."); + } + } } diff --git a/src/main/java/nextstep/ladder/domain/LineGenerator.java b/src/main/java/nextstep/ladder/domain/BridgesGenerator.java similarity index 76% rename from src/main/java/nextstep/ladder/domain/LineGenerator.java rename to src/main/java/nextstep/ladder/domain/BridgesGenerator.java index 049e3bdd19..b554c7ece9 100644 --- a/src/main/java/nextstep/ladder/domain/LineGenerator.java +++ b/src/main/java/nextstep/ladder/domain/BridgesGenerator.java @@ -2,6 +2,6 @@ import java.util.List; -public interface LineGenerator { +public interface BridgesGenerator { List generateBridges(Integer numbersOfPeople); } diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java new file mode 100644 index 0000000000..ce65c32f1d --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -0,0 +1,32 @@ +package nextstep.ladder.domain; + +import java.util.List; + +public class Line { + + private final List bridges; + + public Line(Integer numbersOfPeople, List bridges) { + validateLine(numbersOfPeople, bridges); + this.bridges = bridges; + } + + private void validateLine(Integer numbersOfPeople, List bridges) { + validateBridgeCount(numbersOfPeople, bridges); + validateContinuousTrueBridge(bridges); + } + + private void validateBridgeCount(Integer numbersOfPeople, List bridges) { + if (bridges.size() != numbersOfPeople - 1) { + throw new IllegalArgumentException("다리의 개수는 사람의 수보다 1 작아야합니다"); + } + } + + private void validateContinuousTrueBridge(List bridges) { + bridges.stream() + .reduce((prevBridge, currentBridge) -> { + prevBridge.compareToNextBridge(currentBridge); + return currentBridge; + }); + } +} diff --git a/src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java b/src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java similarity index 55% rename from src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java rename to src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java index 88ce1c285c..61d8ca23ec 100644 --- a/src/main/java/nextstep/ladder/domain/SequentialRandomLineGenerator.java +++ b/src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java @@ -4,10 +4,13 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; -public class SequentialRandomLineGenerator implements LineGenerator{ +public class SequentialRandomBridgesGenerator implements BridgesGenerator { + + private static final Integer MIN_NUMBERS_OF_PEOPLE = 2; @Override public List generateBridges(Integer numbersOfPeople) { + validateNumbersOfPeople(numbersOfPeople); List bridges = new LinkedList<>(); Bridge currentBridge = Bridge.of(ThreadLocalRandom.current().nextBoolean()); for (int i = 0; i < numbersOfPeople - 1; i++) { @@ -16,4 +19,10 @@ public List generateBridges(Integer numbersOfPeople) { } return bridges; } + + private void validateNumbersOfPeople(Integer numbersOfPeople) { + if (numbersOfPeople < MIN_NUMBERS_OF_PEOPLE) { + throw new IllegalArgumentException("사람은 최소 2명 이상이어야 합니다."); + } + } } diff --git a/src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java b/src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java new file mode 100644 index 0000000000..079282e6e5 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java @@ -0,0 +1,22 @@ +package nextstep.ladder.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +public class SequentialRandomBridgesGeneratorTest { + + private final BridgesGenerator bridgesGenerator = new SequentialRandomBridgesGenerator(); + + @Test + public void generateBridges_다리_개수_확인() { + assertThat(bridgesGenerator.generateBridges(5)).hasSize(4); + } + + @Test + public void generateBridges_사람수_1명일때_에러_테스트() { + assertThatThrownBy(() -> bridgesGenerator.generateBridges(1)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java b/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java deleted file mode 100644 index 991bb5f8a8..0000000000 --- a/src/test/java/nextstep/ladder/domain/SequentialRandomLineGeneratorTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package nextstep.ladder.domain; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; - -public class SequentialRandomLineGeneratorTest { - - private final LineGenerator lineGenerator = new SequentialRandomLineGenerator(); - - @Test - public void generateBridges_다리_개수_확인() { - assertThat(lineGenerator.generateBridges(5)).hasSize(4); - } -} From 4e7450f055eb3accfdabda2da8c06bde931ba617 Mon Sep 17 00:00:00 2001 From: yumble Date: Sun, 10 Dec 2023 16:07:25 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../ladder/{domain => model}/Bridge.java | 4 +-- .../{domain => model}/BridgesGenerator.java | 2 +- .../java/nextstep/ladder/model/Ladder.java | 14 +++++++++++ .../ladder/{domain => model}/Line.java | 2 +- .../nextstep/ladder/model/LinesGenerator.java | 25 +++++++++++++++++++ .../SequentialRandomBridgesGenerator.java | 2 +- .../ladder/{domain => model}/BridgeTest.java | 2 +- .../java/nextstep/ladder/model/LineTest.java | 23 +++++++++++++++++ .../ladder/model/LinesGeneratorTest.java | 22 ++++++++++++++++ .../SequentialRandomBridgesGeneratorTest.java | 2 +- 11 files changed, 92 insertions(+), 8 deletions(-) rename src/main/java/nextstep/ladder/{domain => model}/Bridge.java (92%) rename src/main/java/nextstep/ladder/{domain => model}/BridgesGenerator.java (79%) create mode 100644 src/main/java/nextstep/ladder/model/Ladder.java rename src/main/java/nextstep/ladder/{domain => model}/Line.java (96%) create mode 100644 src/main/java/nextstep/ladder/model/LinesGenerator.java rename src/main/java/nextstep/ladder/{domain => model}/SequentialRandomBridgesGenerator.java (96%) rename src/test/java/nextstep/ladder/{domain => model}/BridgeTest.java (93%) create mode 100644 src/test/java/nextstep/ladder/model/LineTest.java create mode 100644 src/test/java/nextstep/ladder/model/LinesGeneratorTest.java rename src/test/java/nextstep/ladder/{domain => model}/SequentialRandomBridgesGeneratorTest.java (95%) diff --git a/README.md b/README.md index 6a97960cfe..709bacca8b 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ * [ ] 쉼표 구분자를 파싱하기 * [ ] 최대 사다리 높이 입력받기 * [ ] 실행결과 출력하기 -* [ ] 사다리 만들기 +* [X] 사다리 만들기 * [X] 사다리 한 줄(Line) 만들기 * [X] 사다리 다리 구성하기 (Bridge) * [X] 캐시 전략 사용하기 diff --git a/src/main/java/nextstep/ladder/domain/Bridge.java b/src/main/java/nextstep/ladder/model/Bridge.java similarity index 92% rename from src/main/java/nextstep/ladder/domain/Bridge.java rename to src/main/java/nextstep/ladder/model/Bridge.java index 28102724a8..6a1016eb08 100644 --- a/src/main/java/nextstep/ladder/domain/Bridge.java +++ b/src/main/java/nextstep/ladder/model/Bridge.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import java.util.HashMap; import java.util.Map; @@ -18,7 +18,7 @@ private Bridge(boolean value) { this.value = value; } - static Bridge of(boolean value) { + public static Bridge of(boolean value) { return cacheBridge.get(value); } diff --git a/src/main/java/nextstep/ladder/domain/BridgesGenerator.java b/src/main/java/nextstep/ladder/model/BridgesGenerator.java similarity index 79% rename from src/main/java/nextstep/ladder/domain/BridgesGenerator.java rename to src/main/java/nextstep/ladder/model/BridgesGenerator.java index b554c7ece9..3cf8413737 100644 --- a/src/main/java/nextstep/ladder/domain/BridgesGenerator.java +++ b/src/main/java/nextstep/ladder/model/BridgesGenerator.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import java.util.List; diff --git a/src/main/java/nextstep/ladder/model/Ladder.java b/src/main/java/nextstep/ladder/model/Ladder.java new file mode 100644 index 0000000000..7d84e03b6c --- /dev/null +++ b/src/main/java/nextstep/ladder/model/Ladder.java @@ -0,0 +1,14 @@ +package nextstep.ladder.model; + +import java.util.List; + +public class Ladder { + + private final List lines; + private final Integer height; + + public Ladder(List lines, Integer height) { + this.lines = lines; + this.height = height; + } +} diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/model/Line.java similarity index 96% rename from src/main/java/nextstep/ladder/domain/Line.java rename to src/main/java/nextstep/ladder/model/Line.java index ce65c32f1d..4a89aaa959 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/model/Line.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import java.util.List; diff --git a/src/main/java/nextstep/ladder/model/LinesGenerator.java b/src/main/java/nextstep/ladder/model/LinesGenerator.java new file mode 100644 index 0000000000..9e99c9612c --- /dev/null +++ b/src/main/java/nextstep/ladder/model/LinesGenerator.java @@ -0,0 +1,25 @@ +package nextstep.ladder.model; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LinesGenerator { + + private static final Integer MIN_HEIGHT = 1; + + private final BridgesGenerator bridgesGenerator = new SequentialRandomBridgesGenerator(); + + public List generatorLines(Integer numbersOfPeople, Integer height) { + validateHeight(height); + return IntStream.range(0, height) + .mapToObj(index -> new Line(numbersOfPeople, bridgesGenerator.generateBridges(numbersOfPeople))) + .collect(Collectors.toList()); + } + + private void validateHeight(Integer height) { + if (height < MIN_HEIGHT) { + throw new IllegalArgumentException("높이는 최소 1 이상이어야 합니다."); + } + } +} diff --git a/src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java b/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java similarity index 96% rename from src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java rename to src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java index 61d8ca23ec..58ec0cba5a 100644 --- a/src/main/java/nextstep/ladder/domain/SequentialRandomBridgesGenerator.java +++ b/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import java.util.LinkedList; import java.util.List; diff --git a/src/test/java/nextstep/ladder/domain/BridgeTest.java b/src/test/java/nextstep/ladder/model/BridgeTest.java similarity index 93% rename from src/test/java/nextstep/ladder/domain/BridgeTest.java rename to src/test/java/nextstep/ladder/model/BridgeTest.java index 8d55a27aec..631f3377ca 100644 --- a/src/test/java/nextstep/ladder/domain/BridgeTest.java +++ b/src/test/java/nextstep/ladder/model/BridgeTest.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/nextstep/ladder/model/LineTest.java b/src/test/java/nextstep/ladder/model/LineTest.java new file mode 100644 index 0000000000..1096e9c92d --- /dev/null +++ b/src/test/java/nextstep/ladder/model/LineTest.java @@ -0,0 +1,23 @@ +package nextstep.ladder.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.Test; + +public class LineTest { + + @Test + public void 다리가_연속으로_True_일때_에러반환_테스트() { + List bridges = List.of(Bridge.of(true), Bridge.of(true)); + assertThatThrownBy(() -> new Line(5, bridges)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void 다리가_사람수의_MINUS1이_아닐때_에러반환_테스트() { + List bridges = List.of(Bridge.of(true), Bridge.of(false)); + assertThatThrownBy(() -> new Line(5, bridges)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java b/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java new file mode 100644 index 0000000000..c834ae56b6 --- /dev/null +++ b/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java @@ -0,0 +1,22 @@ +package nextstep.ladder.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +public class LinesGeneratorTest { + + private final LinesGenerator linesGenerator = new LinesGenerator(); + + @Test + public void generatorLines_높이에_맞게_생성하는지_테스트() { + assertThat(linesGenerator.generatorLines(5, 6)).hasSize(6); + } + + @Test + public void generatorLines_높이가_0일때_에러_테스트() { + assertThatThrownBy( () -> linesGenerator.generatorLines(5, 0)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java similarity index 95% rename from src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java rename to src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java index 079282e6e5..75cd1e9894 100644 --- a/src/test/java/nextstep/ladder/domain/SequentialRandomBridgesGeneratorTest.java +++ b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.model; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; From 16783e90db35a481ccc44ca1e27f0521db353fa8 Mon Sep 17 00:00:00 2001 From: yumble Date: Sun, 10 Dec 2023 17:09:24 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=EC=82=AC=EB=9E=8C=20=EB=AA=85?= =?UTF-8?q?=EB=8B=A8,=20=EB=86=92=EC=9D=B4=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EA=B8=B0=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - refactoring 사항 - validation은 generator에서 객체로 이동 - 생성자에서 필드를 초기화하는 것이 아닌, 컨트롤러에서 필드 값들을 만들고 넘겨주는 것으로 변경 --- README.md | 6 ++-- .../ladder/controller/LadderController.java | 20 +++++++++++++ .../java/nextstep/ladder/model/Ladder.java | 19 +++++++++--- src/main/java/nextstep/ladder/model/Line.java | 9 ++++++ .../java/nextstep/ladder/model/Lines.java | 12 ++++++++ .../nextstep/ladder/model/LinesGenerator.java | 9 ------ .../nextstep/ladder/model/Participant.java | 20 +++++++++++++ .../nextstep/ladder/model/Participants.java | 29 +++++++++++++++++++ .../SequentialRandomBridgesGenerator.java | 9 ------ .../java/nextstep/ladder/view/InputView.java | 17 +++++++++++ .../nextstep/ladder/model/BridgeTest.java | 20 +++++++++++++ .../nextstep/ladder/model/LadderTest.java | 28 ++++++++++++++++++ .../java/nextstep/ladder/model/LineTest.java | 7 +++++ .../ladder/model/LinesGeneratorTest.java | 7 ----- .../ladder/model/ParticipantTest.java | 14 +++++++++ .../SequentialRandomBridgesGeneratorTest.java | 6 +--- 16 files changed, 195 insertions(+), 37 deletions(-) create mode 100644 src/main/java/nextstep/ladder/controller/LadderController.java create mode 100644 src/main/java/nextstep/ladder/model/Lines.java create mode 100644 src/main/java/nextstep/ladder/model/Participant.java create mode 100644 src/main/java/nextstep/ladder/model/Participants.java create mode 100644 src/main/java/nextstep/ladder/view/InputView.java create mode 100644 src/test/java/nextstep/ladder/model/LadderTest.java create mode 100644 src/test/java/nextstep/ladder/model/ParticipantTest.java diff --git a/README.md b/README.md index 709bacca8b..9071964682 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,9 @@ * [X] Optional 실습 3 : Optional에서 exception 처리 # STEP 2 -* [ ] 참여할 사람 명단 입력받기 - * [ ] 쉼표 구분자를 파싱하기 -* [ ] 최대 사다리 높이 입력받기 +* [X] 참여할 사람 명단 입력받기 + * [X] 쉼표 구분자를 파싱하기 +* [X] 최대 사다리 높이 입력받기 * [ ] 실행결과 출력하기 * [X] 사다리 만들기 * [X] 사다리 한 줄(Line) 만들기 diff --git a/src/main/java/nextstep/ladder/controller/LadderController.java b/src/main/java/nextstep/ladder/controller/LadderController.java new file mode 100644 index 0000000000..166a59e602 --- /dev/null +++ b/src/main/java/nextstep/ladder/controller/LadderController.java @@ -0,0 +1,20 @@ +package nextstep.ladder.controller; + +import nextstep.ladder.model.Ladder; +import nextstep.ladder.model.Lines; +import nextstep.ladder.model.LinesGenerator; +import nextstep.ladder.model.Participants; +import nextstep.ladder.view.InputView; + +public class LadderController { + + private final LinesGenerator linesGenerator = new LinesGenerator(); + + public void game() { + Participants participants = new Participants(InputView.inputGameParticipants()); + int height = InputView.inputLadderHeight(); + Lines lines = new Lines(linesGenerator.generatorLines(participants.getNumbersOfParticipants(), height)); + + Ladder ladder = new Ladder(participants, lines, height); + } +} diff --git a/src/main/java/nextstep/ladder/model/Ladder.java b/src/main/java/nextstep/ladder/model/Ladder.java index 7d84e03b6c..d4a44b8fa9 100644 --- a/src/main/java/nextstep/ladder/model/Ladder.java +++ b/src/main/java/nextstep/ladder/model/Ladder.java @@ -1,14 +1,25 @@ package nextstep.ladder.model; -import java.util.List; - public class Ladder { - private final List lines; + private static final int MIN_HEIGHT = 1; + + private final Participants participants; + private final Lines lines; private final Integer height; - public Ladder(List lines, Integer height) { + public Ladder(Participants participants, Lines lines, Integer height) { + validateHeight(height); + this.participants = participants; this.lines = lines; this.height = height; } + + private void validateHeight(Integer height) { + if (height < MIN_HEIGHT) { + throw new IllegalArgumentException("높이는 최소 1 이상이어야 합니다."); + } + } + + } diff --git a/src/main/java/nextstep/ladder/model/Line.java b/src/main/java/nextstep/ladder/model/Line.java index 4a89aaa959..9729f2ebbe 100644 --- a/src/main/java/nextstep/ladder/model/Line.java +++ b/src/main/java/nextstep/ladder/model/Line.java @@ -4,6 +4,8 @@ public class Line { + private static final Integer MIN_NUMBERS_OF_PEOPLE = 2; + private final List bridges; public Line(Integer numbersOfPeople, List bridges) { @@ -14,6 +16,7 @@ public Line(Integer numbersOfPeople, List bridges) { private void validateLine(Integer numbersOfPeople, List bridges) { validateBridgeCount(numbersOfPeople, bridges); validateContinuousTrueBridge(bridges); + validateNumbersOfPeople(numbersOfPeople); } private void validateBridgeCount(Integer numbersOfPeople, List bridges) { @@ -29,4 +32,10 @@ private void validateContinuousTrueBridge(List bridges) { return currentBridge; }); } + + private void validateNumbersOfPeople(Integer numbersOfPeople) { + if (numbersOfPeople < MIN_NUMBERS_OF_PEOPLE) { + throw new IllegalArgumentException("사람은 최소 2명 이상이어야 합니다."); + } + } } diff --git a/src/main/java/nextstep/ladder/model/Lines.java b/src/main/java/nextstep/ladder/model/Lines.java new file mode 100644 index 0000000000..55d5e51ae3 --- /dev/null +++ b/src/main/java/nextstep/ladder/model/Lines.java @@ -0,0 +1,12 @@ +package nextstep.ladder.model; + +import java.util.List; + +public class Lines { + + private final List lines; + + public Lines(List lines) { + this.lines = lines; + } +} diff --git a/src/main/java/nextstep/ladder/model/LinesGenerator.java b/src/main/java/nextstep/ladder/model/LinesGenerator.java index 9e99c9612c..270427e97b 100644 --- a/src/main/java/nextstep/ladder/model/LinesGenerator.java +++ b/src/main/java/nextstep/ladder/model/LinesGenerator.java @@ -6,20 +6,11 @@ public class LinesGenerator { - private static final Integer MIN_HEIGHT = 1; - private final BridgesGenerator bridgesGenerator = new SequentialRandomBridgesGenerator(); public List generatorLines(Integer numbersOfPeople, Integer height) { - validateHeight(height); return IntStream.range(0, height) .mapToObj(index -> new Line(numbersOfPeople, bridgesGenerator.generateBridges(numbersOfPeople))) .collect(Collectors.toList()); } - - private void validateHeight(Integer height) { - if (height < MIN_HEIGHT) { - throw new IllegalArgumentException("높이는 최소 1 이상이어야 합니다."); - } - } } diff --git a/src/main/java/nextstep/ladder/model/Participant.java b/src/main/java/nextstep/ladder/model/Participant.java new file mode 100644 index 0000000000..b92403766b --- /dev/null +++ b/src/main/java/nextstep/ladder/model/Participant.java @@ -0,0 +1,20 @@ +package nextstep.ladder.model; + +public class Participant { + + private static final Integer MIN_NAME_LENGTH = 1; + private static final Integer MAX_NAME_LENGTH = 5; + + private final String name; + + public Participant(String name) { + validateNameLength(name); + this.name = name; + } + + private void validateNameLength(String name) { + if (name.length() < MIN_NAME_LENGTH || name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("0글자 이하이거나 5글자를 초과하는 참가자 이름이 포함되어 있습니다."); + } + } +} diff --git a/src/main/java/nextstep/ladder/model/Participants.java b/src/main/java/nextstep/ladder/model/Participants.java new file mode 100644 index 0000000000..bdb91e9742 --- /dev/null +++ b/src/main/java/nextstep/ladder/model/Participants.java @@ -0,0 +1,29 @@ +package nextstep.ladder.model; + +import java.util.List; +import java.util.stream.Collectors; + +public class Participants { + + private static final String DELIMITER = ","; + + private final List participants; + + public Participants(String inputParticipants) { + this.participants = createParticipants(parseInputParticipants(inputParticipants)); + } + + private List parseInputParticipants(String inputParticipants) { + return List.of(inputParticipants.split(DELIMITER)); + } + + private List createParticipants(List inputParticipants) { + return inputParticipants.stream() + .map(Participant::new) + .collect(Collectors.toList()); + } + + public Integer getNumbersOfParticipants() { + return participants.size(); + } +} diff --git a/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java b/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java index 58ec0cba5a..5b710a4c74 100644 --- a/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java +++ b/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java @@ -6,11 +6,8 @@ public class SequentialRandomBridgesGenerator implements BridgesGenerator { - private static final Integer MIN_NUMBERS_OF_PEOPLE = 2; - @Override public List generateBridges(Integer numbersOfPeople) { - validateNumbersOfPeople(numbersOfPeople); List bridges = new LinkedList<>(); Bridge currentBridge = Bridge.of(ThreadLocalRandom.current().nextBoolean()); for (int i = 0; i < numbersOfPeople - 1; i++) { @@ -19,10 +16,4 @@ public List generateBridges(Integer numbersOfPeople) { } return bridges; } - - private void validateNumbersOfPeople(Integer numbersOfPeople) { - if (numbersOfPeople < MIN_NUMBERS_OF_PEOPLE) { - throw new IllegalArgumentException("사람은 최소 2명 이상이어야 합니다."); - } - } } diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java new file mode 100644 index 0000000000..8b583a7271 --- /dev/null +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -0,0 +1,17 @@ +package nextstep.ladder.view; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public static String inputGameParticipants() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + return scanner.nextLine(); + } + + public static int inputLadderHeight() { + System.out.println("최대 사다리 높이는 몇 개인가요?"); + return Integer.parseInt(scanner.nextLine()); + } +} diff --git a/src/test/java/nextstep/ladder/model/BridgeTest.java b/src/test/java/nextstep/ladder/model/BridgeTest.java index 631f3377ca..9e5dde35e0 100644 --- a/src/test/java/nextstep/ladder/model/BridgeTest.java +++ b/src/test/java/nextstep/ladder/model/BridgeTest.java @@ -1,6 +1,8 @@ package nextstep.ladder.model; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.Test; @@ -19,4 +21,22 @@ public class BridgeTest { assertThat(bridge.canCrossBridge()).isFalse(); } + + @Test + public void compareToNextBridge_연속된_두개가_True일시_에러_반환() { + Bridge prev = Bridge.of(true); + Bridge next = Bridge.of(true); + + assertThatThrownBy(() -> prev.compareToNextBridge(next)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void compareToNextBridge_연속된_두개가_True가_아닐시_정상동작_테스트() { + Bridge prev = Bridge.of(false); + Bridge next = Bridge.of(true); + + assertThatCode(() -> prev.compareToNextBridge(next)) + .doesNotThrowAnyException(); // 예외가 발생하지 않아야 함 + } } diff --git a/src/test/java/nextstep/ladder/model/LadderTest.java b/src/test/java/nextstep/ladder/model/LadderTest.java new file mode 100644 index 0000000000..14e9020c44 --- /dev/null +++ b/src/test/java/nextstep/ladder/model/LadderTest.java @@ -0,0 +1,28 @@ +package nextstep.ladder.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class LadderTest { + + private Participants participants; + private Lines lines; + + @BeforeEach + public void setup() { + List bridges = List.of(Bridge.of(true)); + List line = List.of(new Line(2, bridges)); + + participants = new Participants("a,b"); + lines = new Lines(line); + } + + @Test + public void generatorLines_높이가_0일때_에러_테스트() { + assertThatThrownBy( () -> new Ladder(participants, lines, 0)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/nextstep/ladder/model/LineTest.java b/src/test/java/nextstep/ladder/model/LineTest.java index 1096e9c92d..5a43f78fbe 100644 --- a/src/test/java/nextstep/ladder/model/LineTest.java +++ b/src/test/java/nextstep/ladder/model/LineTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.Test; @@ -20,4 +21,10 @@ public class LineTest { assertThatThrownBy(() -> new Line(5, bridges)) .isInstanceOf(IllegalArgumentException.class); } + + @Test + public void 사람수_1명일때_에러_테스트() { + assertThatThrownBy(() -> new Line(1, new LinkedList<>())) + .isInstanceOf(IllegalArgumentException.class); + } } diff --git a/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java b/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java index c834ae56b6..5dfd103914 100644 --- a/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java +++ b/src/test/java/nextstep/ladder/model/LinesGeneratorTest.java @@ -1,7 +1,6 @@ package nextstep.ladder.model; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.Test; @@ -13,10 +12,4 @@ public class LinesGeneratorTest { public void generatorLines_높이에_맞게_생성하는지_테스트() { assertThat(linesGenerator.generatorLines(5, 6)).hasSize(6); } - - @Test - public void generatorLines_높이가_0일때_에러_테스트() { - assertThatThrownBy( () -> linesGenerator.generatorLines(5, 0)) - .isInstanceOf(IllegalArgumentException.class); - } } diff --git a/src/test/java/nextstep/ladder/model/ParticipantTest.java b/src/test/java/nextstep/ladder/model/ParticipantTest.java new file mode 100644 index 0000000000..3d346914df --- /dev/null +++ b/src/test/java/nextstep/ladder/model/ParticipantTest.java @@ -0,0 +1,14 @@ +package nextstep.ladder.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +public class ParticipantTest { + + @Test + public void 이름_5글자_이상일때_에러_반환_테스트() { + assertThatThrownBy(() -> new Participant("aaaaaa")) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java index 75cd1e9894..f1efa9102a 100644 --- a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java +++ b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java @@ -14,9 +14,5 @@ public class SequentialRandomBridgesGeneratorTest { assertThat(bridgesGenerator.generateBridges(5)).hasSize(4); } - @Test - public void generateBridges_사람수_1명일때_에러_테스트() { - assertThatThrownBy(() -> bridgesGenerator.generateBridges(1)) - .isInstanceOf(IllegalArgumentException.class); - } + } From e9549128ddabb0c9fe45c0b5d00dec121d351c05 Mon Sep 17 00:00:00 2001 From: yumble Date: Sun, 10 Dec 2023 18:09:11 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=EC=8B=A4=ED=96=89=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../nextstep/ladder/LadderApplication.java | 11 +++++ .../ladder/controller/LadderController.java | 2 + .../java/nextstep/ladder/model/Bridge.java | 2 +- .../java/nextstep/ladder/model/Ladder.java | 6 +++ src/main/java/nextstep/ladder/model/Line.java | 4 ++ .../java/nextstep/ladder/model/Lines.java | 4 ++ .../nextstep/ladder/model/Participant.java | 4 ++ .../nextstep/ladder/model/Participants.java | 4 ++ .../java/nextstep/ladder/view/OutputView.java | 45 +++++++++++++++++++ .../nextstep/ladder/model/BridgeTest.java | 7 +++ .../SequentialRandomBridgesGeneratorTest.java | 3 -- 12 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/main/java/nextstep/ladder/LadderApplication.java create mode 100644 src/main/java/nextstep/ladder/view/OutputView.java diff --git a/README.md b/README.md index 9071964682..2535762d88 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ * [X] 참여할 사람 명단 입력받기 * [X] 쉼표 구분자를 파싱하기 * [X] 최대 사다리 높이 입력받기 -* [ ] 실행결과 출력하기 +* [X] 실행결과 출력하기 * [X] 사다리 만들기 * [X] 사다리 한 줄(Line) 만들기 * [X] 사다리 다리 구성하기 (Bridge) diff --git a/src/main/java/nextstep/ladder/LadderApplication.java b/src/main/java/nextstep/ladder/LadderApplication.java new file mode 100644 index 0000000000..a9ccadb2e4 --- /dev/null +++ b/src/main/java/nextstep/ladder/LadderApplication.java @@ -0,0 +1,11 @@ +package nextstep.ladder; + +import nextstep.ladder.controller.LadderController; + +public class LadderApplication { + + public static void main(String[] args) { + LadderController ladderController = new LadderController(); + ladderController.game(); + } +} diff --git a/src/main/java/nextstep/ladder/controller/LadderController.java b/src/main/java/nextstep/ladder/controller/LadderController.java index 166a59e602..ad617c94ca 100644 --- a/src/main/java/nextstep/ladder/controller/LadderController.java +++ b/src/main/java/nextstep/ladder/controller/LadderController.java @@ -5,6 +5,7 @@ import nextstep.ladder.model.LinesGenerator; import nextstep.ladder.model.Participants; import nextstep.ladder.view.InputView; +import nextstep.ladder.view.OutputView; public class LadderController { @@ -16,5 +17,6 @@ public void game() { Lines lines = new Lines(linesGenerator.generatorLines(participants.getNumbersOfParticipants(), height)); Ladder ladder = new Ladder(participants, lines, height); + OutputView.printLadder(ladder); } } diff --git a/src/main/java/nextstep/ladder/model/Bridge.java b/src/main/java/nextstep/ladder/model/Bridge.java index 6a1016eb08..41dfeb15c2 100644 --- a/src/main/java/nextstep/ladder/model/Bridge.java +++ b/src/main/java/nextstep/ladder/model/Bridge.java @@ -22,7 +22,7 @@ public static Bridge of(boolean value) { return cacheBridge.get(value); } - boolean canCrossBridge() { + public boolean canCrossBridge() { return value; } diff --git a/src/main/java/nextstep/ladder/model/Ladder.java b/src/main/java/nextstep/ladder/model/Ladder.java index d4a44b8fa9..bc89eba56f 100644 --- a/src/main/java/nextstep/ladder/model/Ladder.java +++ b/src/main/java/nextstep/ladder/model/Ladder.java @@ -21,5 +21,11 @@ private void validateHeight(Integer height) { } } + public Participants getParticipants() { + return participants; + } + public Lines getLines() { + return lines; + } } diff --git a/src/main/java/nextstep/ladder/model/Line.java b/src/main/java/nextstep/ladder/model/Line.java index 9729f2ebbe..1e4f656aab 100644 --- a/src/main/java/nextstep/ladder/model/Line.java +++ b/src/main/java/nextstep/ladder/model/Line.java @@ -38,4 +38,8 @@ private void validateNumbersOfPeople(Integer numbersOfPeople) { throw new IllegalArgumentException("사람은 최소 2명 이상이어야 합니다."); } } + + public List getBridges() { + return bridges; + } } diff --git a/src/main/java/nextstep/ladder/model/Lines.java b/src/main/java/nextstep/ladder/model/Lines.java index 55d5e51ae3..8aa8aa8fd2 100644 --- a/src/main/java/nextstep/ladder/model/Lines.java +++ b/src/main/java/nextstep/ladder/model/Lines.java @@ -9,4 +9,8 @@ public class Lines { public Lines(List lines) { this.lines = lines; } + + public List getLines() { + return lines; + } } diff --git a/src/main/java/nextstep/ladder/model/Participant.java b/src/main/java/nextstep/ladder/model/Participant.java index b92403766b..8fefccf582 100644 --- a/src/main/java/nextstep/ladder/model/Participant.java +++ b/src/main/java/nextstep/ladder/model/Participant.java @@ -17,4 +17,8 @@ private void validateNameLength(String name) { throw new IllegalArgumentException("0글자 이하이거나 5글자를 초과하는 참가자 이름이 포함되어 있습니다."); } } + + public String getName() { + return name; + } } diff --git a/src/main/java/nextstep/ladder/model/Participants.java b/src/main/java/nextstep/ladder/model/Participants.java index bdb91e9742..0c43e10e25 100644 --- a/src/main/java/nextstep/ladder/model/Participants.java +++ b/src/main/java/nextstep/ladder/model/Participants.java @@ -26,4 +26,8 @@ private List createParticipants(List inputParticipants) { public Integer getNumbersOfParticipants() { return participants.size(); } + + public List getParticipants() { + return participants; + } } diff --git a/src/main/java/nextstep/ladder/view/OutputView.java b/src/main/java/nextstep/ladder/view/OutputView.java new file mode 100644 index 0000000000..10b6c80bf2 --- /dev/null +++ b/src/main/java/nextstep/ladder/view/OutputView.java @@ -0,0 +1,45 @@ +package nextstep.ladder.view; + +import java.util.stream.Collectors; +import nextstep.ladder.model.Ladder; +import nextstep.ladder.model.Line; +import nextstep.ladder.model.Lines; +import nextstep.ladder.model.Participant; +import nextstep.ladder.model.Participants; + +public class OutputView { + private static final StringBuffer buffer = new StringBuffer(); + private static final String INITIAL_BRIDGE = " |"; + private static final String PASSABLE_BRIDGE = "-----|"; + private static final String IMPASSABLE_BRIDGE = " |"; + + public static void printLadder(Ladder ladder) { + + buffer.append("\n실행결과\n"); + printParticipants(ladder.getParticipants()); + printLadderLines(ladder.getLines()); + System.out.println(buffer); + } + + public static void printParticipants(Participants participants) { + for (Participant participant : participants.getParticipants()) { + buffer.append(String.format ("%6s", participant.getName())); + } + buffer.append("\n"); + } + + private static void printLadderLines(Lines lines) { + for (Line line : lines.getLines()) { + buffer.append(INITIAL_BRIDGE); + printLine(line); + buffer.append("\n"); + } + } + + private static void printLine(Line line) { + buffer.append( + line.getBridges().stream() + .map(bridge -> bridge.canCrossBridge() ? PASSABLE_BRIDGE : IMPASSABLE_BRIDGE) + .collect(Collectors.joining())); + } +} diff --git a/src/test/java/nextstep/ladder/model/BridgeTest.java b/src/test/java/nextstep/ladder/model/BridgeTest.java index 9e5dde35e0..3b834d662a 100644 --- a/src/test/java/nextstep/ladder/model/BridgeTest.java +++ b/src/test/java/nextstep/ladder/model/BridgeTest.java @@ -22,6 +22,13 @@ public class BridgeTest { assertThat(bridge.canCrossBridge()).isFalse(); } + @Test + public void next_현재_다리_value가_TRUE_일때_무조건_False반환() { + Bridge now = Bridge.of(true); + + assertThat(now.next()).isEqualTo(Bridge.of(false)); + } + @Test public void compareToNextBridge_연속된_두개가_True일시_에러_반환() { Bridge prev = Bridge.of(true); diff --git a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java index f1efa9102a..dac0d48537 100644 --- a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java +++ b/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java @@ -1,7 +1,6 @@ package nextstep.ladder.model; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.Test; @@ -13,6 +12,4 @@ public class SequentialRandomBridgesGeneratorTest { public void generateBridges_다리_개수_확인() { assertThat(bridgesGenerator.generateBridges(5)).hasSize(4); } - - } From 931105b4504f428ed5e65cae13ce69b4645bc662 Mon Sep 17 00:00:00 2001 From: yumble Date: Sun, 10 Dec 2023 20:46:04 +0900 Subject: [PATCH 8/8] feat: BridgesGeneratorByCreatingCandidates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모든 Line 후보를 만들어놓고 shuffle을 통해 하나의 후보를 꺼내쓰는 전략 --- .../BridgesGeneratorByCreatingCandidates.java | 49 +++++++++++++++++++ ...> BridgesGeneratorBySequentialRandom.java} | 2 +- .../nextstep/ladder/model/LinesGenerator.java | 2 +- ...idgesGeneratorBySequentialRandomTest.java} | 4 +- 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/main/java/nextstep/ladder/model/BridgesGeneratorByCreatingCandidates.java rename src/main/java/nextstep/ladder/model/{SequentialRandomBridgesGenerator.java => BridgesGeneratorBySequentialRandom.java} (87%) rename src/test/java/nextstep/ladder/model/{SequentialRandomBridgesGeneratorTest.java => BridgesGeneratorBySequentialRandomTest.java} (64%) diff --git a/src/main/java/nextstep/ladder/model/BridgesGeneratorByCreatingCandidates.java b/src/main/java/nextstep/ladder/model/BridgesGeneratorByCreatingCandidates.java new file mode 100644 index 0000000000..c89f95232a --- /dev/null +++ b/src/main/java/nextstep/ladder/model/BridgesGeneratorByCreatingCandidates.java @@ -0,0 +1,49 @@ +package nextstep.ladder.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class BridgesGeneratorByCreatingCandidates implements BridgesGenerator { + + private static List> candidates = new ArrayList<>(); + + static void generateLadders(int numbersOfPeople) { + List> result = new ArrayList<>(List.of(List.of(Bridge.of(false)), List.of(Bridge.of(true)))); + + for (int i = 2; i < numbersOfPeople ; i++) { + result = dp(result); + } + + candidates = result; + } + + static List> dp(List> result) { + return result.stream() + .flatMap(ladder -> { + List withFalse = new ArrayList<>(ladder); + withFalse.add(Bridge.of(false)); + List withTrue = new ArrayList<>(ladder); + if (!ladder.get(ladder.size() - 1).canCrossBridge()) { + withTrue.add(Bridge.of(true)); + return Stream.of(withFalse, withTrue); + } + return Stream.of(withFalse); + }) + .collect(Collectors.toList()); + } + + @Override + public List generateBridges(Integer numbersOfPeople) { + if (candidates.isEmpty()) { + generateLadders(numbersOfPeople); + } + Collections.shuffle(candidates); + return candidates.get(0); + } + + + +} diff --git a/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java b/src/main/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandom.java similarity index 87% rename from src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java rename to src/main/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandom.java index 5b710a4c74..96e947bbdf 100644 --- a/src/main/java/nextstep/ladder/model/SequentialRandomBridgesGenerator.java +++ b/src/main/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandom.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; -public class SequentialRandomBridgesGenerator implements BridgesGenerator { +public class BridgesGeneratorBySequentialRandom implements BridgesGenerator { @Override public List generateBridges(Integer numbersOfPeople) { diff --git a/src/main/java/nextstep/ladder/model/LinesGenerator.java b/src/main/java/nextstep/ladder/model/LinesGenerator.java index 270427e97b..1ddcd8a46a 100644 --- a/src/main/java/nextstep/ladder/model/LinesGenerator.java +++ b/src/main/java/nextstep/ladder/model/LinesGenerator.java @@ -6,7 +6,7 @@ public class LinesGenerator { - private final BridgesGenerator bridgesGenerator = new SequentialRandomBridgesGenerator(); + private final BridgesGenerator bridgesGenerator = new BridgesGeneratorBySequentialRandom(); public List generatorLines(Integer numbersOfPeople, Integer height) { return IntStream.range(0, height) diff --git a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java b/src/test/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandomTest.java similarity index 64% rename from src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java rename to src/test/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandomTest.java index dac0d48537..2b573763fd 100644 --- a/src/test/java/nextstep/ladder/model/SequentialRandomBridgesGeneratorTest.java +++ b/src/test/java/nextstep/ladder/model/BridgesGeneratorBySequentialRandomTest.java @@ -4,9 +4,9 @@ import org.junit.jupiter.api.Test; -public class SequentialRandomBridgesGeneratorTest { +public class BridgesGeneratorBySequentialRandomTest { - private final BridgesGenerator bridgesGenerator = new SequentialRandomBridgesGenerator(); + private final BridgesGenerator bridgesGenerator = new BridgesGeneratorBySequentialRandom(); @Test public void generateBridges_다리_개수_확인() {