From d869af9c600634c85af0e46089f7363c9ee58bf3 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 01:10:44 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[step2]=20refactor:=201=EB=8B=A8=EA=B3=84?= =?UTF-8?q?=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/StreamStudy.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b9e0eba075..b30106216c 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -16,7 +16,10 @@ public static long countWords() throws IOException { .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); - long count = words.stream().filter(word -> word.length() > 12).count(); + long count = words + .stream() + .filter(word -> word.length() > 12) + .count(); return count; } @@ -27,10 +30,10 @@ public static void printLongestWordTop100() throws IOException { words.stream() .filter(word -> 12 < word.length()) - .distinct() .sorted(Comparator.comparingInt(String::length)) .limit(100) .map(String::toLowerCase) + .distinct() .forEach(word -> System.out.println(word)); } @@ -39,7 +42,9 @@ public static List doubleNumbers(List numbers) { } public static long sumAll(List numbers) { - return numbers.stream().reduce(0, (x, y) -> x + y); + return numbers + .stream() + .reduce(0, (x, y) -> x + y); } public static long sumOverThreeAndDouble(List numbers) { @@ -47,7 +52,6 @@ public static long sumOverThreeAndDouble(List numbers) { .filter(number -> 3 < number) .map(number -> number * 2) .reduce(0, (x, y) -> x + y); - return result; } } From 160a7c0e09f2cce3b22985f0548cf44e1d8669c9 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 01:23:05 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[step2]=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20R?= =?UTF-8?q?EADME=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b853592f59..62e8235761 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ -# 사다리 게임 -## 진행 방법 -* 사다리 게임 게임 요구사항을 파악한다. -* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다. -* 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다. -* 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다. +# 사디리 +## 기능 요구사항 +* 사다리 게임에 참여하는 사람에 이름을 부여할 수 있다. + * 이름은 최대 5글자로 제한된다. + * 사람의 이름은 띄어쓰기가 존재하지 않는 쉼표로 구분한다. +* 사다리의 모양은 |-----|으로 출력된다. + * 사다리를 출력할 때 사람 이름도 같이 출력한다. + * 참여하는 사람의 숫자에 따라 사다리의 폭과 사다리의 개수가 달라진다. + * |-----|-----| 같이 연속적인 사다리는 가능하지 않다. + * 하나의 라인에는 최소 하나 이상이 사다리가 존재하며 사다리의 개수는 랜덤하다. -## 온라인 코드 리뷰 과정 -* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/nextstep-step/nextstep-docs/tree/master/codereview) \ No newline at end of file +## 프로그래밍 요구사항 +* 최대한 자바 8의 스트림과 람다를 이용한다. +* 모든 엔티티를 작게 유지한다. +* 최대한 TDD 기반으로 진행한다. From 3823578c9152503cfde8a6858efee347fd7c6155 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 13:34:24 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[step2]=20feature:=20=EC=82=AC=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=ED=83=80=EA=B8=B0=20=EA=B8=B0=EC=B4=88=20=EB=BC=88?= =?UTF-8?q?=EB=8C=80=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/common/util/ColumnPrinter.java | 10 ++++++++++ .../ladder/common/util/RowLinePrinter.java | 11 +++++++++++ .../ladder/domain/CalculatorFactory.java | 14 ++++++++++++++ .../ladder/domain/ColumnCalculator.java | 9 +++++++++ src/main/java/nextstep/ladder/domain/Line.java | 11 +++++++++++ .../ladder/domain/LineCountCalculator.java | 6 ++++++ .../nextstep/ladder/domain/RowCalculator.java | 13 +++++++++++++ .../ladder/common/util/ColumnPrinterTest.java | 13 +++++++++++++ .../ladder/common/util/RowLinePrinterTest.java | 13 +++++++++++++ .../ladder/domain/CalculatorFactoryTest.java | 17 +++++++++++++++++ .../java/nextstep/ladder/domain/LineTest.java | 15 +++++++++++++++ 11 files changed, 132 insertions(+) create mode 100644 src/main/java/nextstep/ladder/common/util/ColumnPrinter.java create mode 100644 src/main/java/nextstep/ladder/common/util/RowLinePrinter.java create mode 100644 src/main/java/nextstep/ladder/domain/CalculatorFactory.java create mode 100644 src/main/java/nextstep/ladder/domain/ColumnCalculator.java create mode 100644 src/main/java/nextstep/ladder/domain/Line.java create mode 100644 src/main/java/nextstep/ladder/domain/LineCountCalculator.java create mode 100644 src/main/java/nextstep/ladder/domain/RowCalculator.java create mode 100644 src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java create mode 100644 src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java create mode 100644 src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java create mode 100644 src/test/java/nextstep/ladder/domain/LineTest.java diff --git a/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java b/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java new file mode 100644 index 0000000000..f3d1e6964a --- /dev/null +++ b/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java @@ -0,0 +1,10 @@ +package nextstep.ladder.common.util; + +public class ColumnPrinter { + + private static final String SIGN = "|"; + + public static String generate() { + return SIGN; + } +} diff --git a/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java b/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java new file mode 100644 index 0000000000..7658f479af --- /dev/null +++ b/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java @@ -0,0 +1,11 @@ +package nextstep.ladder.common.util; + +public class RowLinePrinter { + + private static final String SIGN = "-"; + private static final int COUNT = 5; + + public static String generate() { + return SIGN.repeat(COUNT); + } +} diff --git a/src/main/java/nextstep/ladder/domain/CalculatorFactory.java b/src/main/java/nextstep/ladder/domain/CalculatorFactory.java new file mode 100644 index 0000000000..9c236c9a66 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/CalculatorFactory.java @@ -0,0 +1,14 @@ +package nextstep.ladder.domain; + +public class CalculatorFactory { + + private static final String ROW = "ROW"; + private static final String COLUMN = "COLUMN"; + + public int calculate(String type, int participantCount) { + if (type.equals(ROW)) { + return new RowCalculator().calculate(participantCount); + } + return new ColumnCalculator().calculate(participantCount); + } +} diff --git a/src/main/java/nextstep/ladder/domain/ColumnCalculator.java b/src/main/java/nextstep/ladder/domain/ColumnCalculator.java new file mode 100644 index 0000000000..d83f2d24e2 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/ColumnCalculator.java @@ -0,0 +1,9 @@ +package nextstep.ladder.domain; + +public class ColumnCalculator implements LineCountCalculator { + + @Override + public int calculate(int participantCount) { + return participantCount; + } +} 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..aface0abae --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -0,0 +1,11 @@ +package nextstep.ladder.domain; + +public class Line { + private int rowLineCount; + private int columnLineCount; + + public Line(int rowLineCount, int columnLineCount) { + this.rowLineCount = rowLineCount; + this.columnLineCount = columnLineCount; + } +} diff --git a/src/main/java/nextstep/ladder/domain/LineCountCalculator.java b/src/main/java/nextstep/ladder/domain/LineCountCalculator.java new file mode 100644 index 0000000000..28e1b40688 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/LineCountCalculator.java @@ -0,0 +1,6 @@ +package nextstep.ladder.domain; + +public interface LineCountCalculator { + + int calculate(int participantCount); +} diff --git a/src/main/java/nextstep/ladder/domain/RowCalculator.java b/src/main/java/nextstep/ladder/domain/RowCalculator.java new file mode 100644 index 0000000000..43656a9660 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/RowCalculator.java @@ -0,0 +1,13 @@ +package nextstep.ladder.domain; + +import java.util.Random; + +public class RowCalculator implements LineCountCalculator { + + private Random random = new Random(); + + @Override + public int calculate(int participantCount) { + return random.nextInt(participantCount); + } +} diff --git a/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java b/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java new file mode 100644 index 0000000000..532a79823c --- /dev/null +++ b/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java @@ -0,0 +1,13 @@ +package nextstep.ladder.common.util; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("사다리 세로 선 출력기 테스트") +public class ColumnPrinterTest { + + @Test + void generate() { + System.out.println("generate : " + ColumnPrinter.generate()); + } +} diff --git a/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java b/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java new file mode 100644 index 0000000000..37807375cf --- /dev/null +++ b/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java @@ -0,0 +1,13 @@ +package nextstep.ladder.common.util; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("사다리 가로 선 출력기 테스트") +public class RowLinePrinterTest { + + @Test + void generate() { + System.out.println("generate : " + RowLinePrinter.generate()); + } +} diff --git a/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java b/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java new file mode 100644 index 0000000000..0e50b26e1e --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java @@ -0,0 +1,17 @@ +package nextstep.ladder.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("라인 개수를 구하는 객체 생성 팩토리 테스트") +public class CalculatorFactoryTest { + + @DisplayName("참가자 수에 따라 가로, 세로 라인의 개수를 구한다.") + @Test + void calculate() { + int participantCount = 4; + Assertions.assertThat(new CalculatorFactory().calculate("ROW", participantCount)).isLessThan(4); + Assertions.assertThat(new CalculatorFactory().calculate("COLUMN", participantCount)).isEqualTo(participantCount); + } +} diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java new file mode 100644 index 0000000000..b881d0f9ed --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/LineTest.java @@ -0,0 +1,15 @@ +package nextstep.ladder.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("하나의 사다리 라인 테스트") +public class LineTest { + + @DisplayName("사다리들을 가지고 있는 하나의 라인 객체를 생성한다.") + @Test + void line() { + Assertions.assertThat(new Line(4,2)).isInstanceOf(Line.class); + } +} From 46a3da73dfb684f187a4bff024996e3284153ed3 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 13:42:30 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[step2]=20feature:=20Line=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=A0=84=EC=B2=B4=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => calculator}/CalculatorFactory.java | 2 +- .../{ => calculator}/ColumnCalculator.java | 2 +- .../{ => calculator}/LineCountCalculator.java | 2 +- .../{ => calculator}/RowCalculator.java | 4 +++- .../ladder/domain/{ => line}/Line.java | 2 +- .../nextstep/ladder/domain/line/Lines.java | 20 +++++++++++++++++++ .../ladder/domain/CalculatorFactoryTest.java | 1 + .../java/nextstep/ladder/domain/LineTest.java | 1 + .../nextstep/ladder/domain/LinesTest.java | 17 ++++++++++++++++ 9 files changed, 46 insertions(+), 5 deletions(-) rename src/main/java/nextstep/ladder/domain/{ => calculator}/CalculatorFactory.java (89%) rename src/main/java/nextstep/ladder/domain/{ => calculator}/ColumnCalculator.java (79%) rename src/main/java/nextstep/ladder/domain/{ => calculator}/LineCountCalculator.java (66%) rename src/main/java/nextstep/ladder/domain/{ => calculator}/RowCalculator.java (70%) rename src/main/java/nextstep/ladder/domain/{ => line}/Line.java (86%) create mode 100644 src/main/java/nextstep/ladder/domain/line/Lines.java create mode 100644 src/test/java/nextstep/ladder/domain/LinesTest.java diff --git a/src/main/java/nextstep/ladder/domain/CalculatorFactory.java b/src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java similarity index 89% rename from src/main/java/nextstep/ladder/domain/CalculatorFactory.java rename to src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java index 9c236c9a66..86e608f96c 100644 --- a/src/main/java/nextstep/ladder/domain/CalculatorFactory.java +++ b/src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.domain.calculator; public class CalculatorFactory { diff --git a/src/main/java/nextstep/ladder/domain/ColumnCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java similarity index 79% rename from src/main/java/nextstep/ladder/domain/ColumnCalculator.java rename to src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java index d83f2d24e2..5dc715055c 100644 --- a/src/main/java/nextstep/ladder/domain/ColumnCalculator.java +++ b/src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.domain.calculator; public class ColumnCalculator implements LineCountCalculator { diff --git a/src/main/java/nextstep/ladder/domain/LineCountCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java similarity index 66% rename from src/main/java/nextstep/ladder/domain/LineCountCalculator.java rename to src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java index 28e1b40688..6cd98e6799 100644 --- a/src/main/java/nextstep/ladder/domain/LineCountCalculator.java +++ b/src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.domain.calculator; public interface LineCountCalculator { diff --git a/src/main/java/nextstep/ladder/domain/RowCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java similarity index 70% rename from src/main/java/nextstep/ladder/domain/RowCalculator.java rename to src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java index 43656a9660..c1ff5d16bd 100644 --- a/src/main/java/nextstep/ladder/domain/RowCalculator.java +++ b/src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java @@ -1,4 +1,6 @@ -package nextstep.ladder.domain; +package nextstep.ladder.domain.calculator; + +import nextstep.ladder.domain.calculator.LineCountCalculator; import java.util.Random; diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/line/Line.java similarity index 86% rename from src/main/java/nextstep/ladder/domain/Line.java rename to src/main/java/nextstep/ladder/domain/line/Line.java index aface0abae..d6f14cbce2 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/line/Line.java @@ -1,4 +1,4 @@ -package nextstep.ladder.domain; +package nextstep.ladder.domain.line; public class Line { private int rowLineCount; diff --git a/src/main/java/nextstep/ladder/domain/line/Lines.java b/src/main/java/nextstep/ladder/domain/line/Lines.java new file mode 100644 index 0000000000..662f1896c7 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/line/Lines.java @@ -0,0 +1,20 @@ +package nextstep.ladder.domain.line; + +import java.util.ArrayList; +import java.util.List; + +public class Lines { + private List lineList; + + public Lines() { + lineList = new ArrayList<>(); + } + + public Lines(List lineList) { + this.lineList = lineList; + } + + public void addLine(Line line) { + lineList.add(line); + } +} diff --git a/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java b/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java index 0e50b26e1e..d1f5ef27e5 100644 --- a/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java +++ b/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java @@ -1,5 +1,6 @@ package nextstep.ladder.domain; +import nextstep.ladder.domain.calculator.CalculatorFactory; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java index b881d0f9ed..d031d7e6cc 100644 --- a/src/test/java/nextstep/ladder/domain/LineTest.java +++ b/src/test/java/nextstep/ladder/domain/LineTest.java @@ -1,5 +1,6 @@ package nextstep.ladder.domain; +import nextstep.ladder.domain.line.Line; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/ladder/domain/LinesTest.java b/src/test/java/nextstep/ladder/domain/LinesTest.java new file mode 100644 index 0000000000..2ccf767e0f --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/LinesTest.java @@ -0,0 +1,17 @@ +package nextstep.ladder.domain; + +import nextstep.ladder.domain.line.Line; +import nextstep.ladder.domain.line.Lines; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("라인 일급 컬렉션 테스트") +public class LinesTest { + + @DisplayName("라인 객체를 추가한다.") + @Test + void addLine() { + Lines lines = new Lines(); + lines.addLine(new Line(1,1)); + } +} From 506538901b97f7354d50923c254a07cc71d20893 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 14:08:15 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[step2]=20feature:=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/ladder/ui/InputView.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/nextstep/ladder/ui/InputView.java diff --git a/src/main/java/nextstep/ladder/ui/InputView.java b/src/main/java/nextstep/ladder/ui/InputView.java new file mode 100644 index 0000000000..22cd8485ec --- /dev/null +++ b/src/main/java/nextstep/ladder/ui/InputView.java @@ -0,0 +1,23 @@ +package nextstep.ladder.ui; + +import java.util.Scanner; + +public class InputView { + + private Scanner scanner = new Scanner(System.in); + + public String inputParticipant() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + return scanner.nextLine(); + } + + public int inputHighCount() { + printEmpty(); + System.out.println("최대 사다리 높이는 몇 개인가요?"); + return scanner.nextInt(); + } + + private void printEmpty() { + System.out.println(""); + } +} From e861b208e3dddd546969acd486239c162fce7352 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 26 Nov 2023 15:32:47 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[step2]=20feature:=20Controller,=20Servic?= =?UTF-8?q?e=20=EC=B4=88=EA=B8=B0=20=EB=BC=88=EB=8C=80=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/application/LadderController.java | 23 +++++++++++++++++++ .../application/service/LadderService.java | 18 +++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/nextstep/ladder/application/LadderController.java create mode 100644 src/main/java/nextstep/ladder/application/service/LadderService.java diff --git a/src/main/java/nextstep/ladder/application/LadderController.java b/src/main/java/nextstep/ladder/application/LadderController.java new file mode 100644 index 0000000000..ff2538ff2f --- /dev/null +++ b/src/main/java/nextstep/ladder/application/LadderController.java @@ -0,0 +1,23 @@ +package nextstep.ladder.application; + +import nextstep.ladder.application.dto.LadderRequest; +import nextstep.ladder.application.dto.LadderResponse; +import nextstep.ladder.application.service.LadderService; +import nextstep.ladder.ui.InputView; + +public class LadderController { + + public static void main(String[] args) { + InputView inputView = new InputView(); + String[] participants = splitParticipants(inputView); + int highCount = inputView.inputHighCount(); + + LadderService ladderService = new LadderService(); + LadderResponse response = ladderService.createLadder(new LadderRequest(participants, highCount)); + } + + private static String[] splitParticipants(InputView inputView) { + return inputView.inputParticipant() + .split(","); + } +} diff --git a/src/main/java/nextstep/ladder/application/service/LadderService.java b/src/main/java/nextstep/ladder/application/service/LadderService.java new file mode 100644 index 0000000000..d23d66bc6f --- /dev/null +++ b/src/main/java/nextstep/ladder/application/service/LadderService.java @@ -0,0 +1,18 @@ +package nextstep.ladder.application.service; + +import nextstep.ladder.application.dto.LadderRequest; +import nextstep.ladder.application.dto.LadderResponse; +import nextstep.ladder.domain.calculator.CalculatorFactory; +import nextstep.ladder.domain.line.Line; +import nextstep.ladder.domain.line.Lines; + +public class LadderService { + + public LadderResponse createLadder(LadderRequest request) { + CalculatorFactory factory = new CalculatorFactory(request.getParticipants()); + Lines lines = new Lines(request.getHighCount()); + lines.addLineByHighCount(new Line(factory)); + + return null; + } +} From 59239b535810685c00feb93cf641660ad276367d Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Fri, 1 Dec 2023 01:07:51 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[step2]=20feature:=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=ED=99=94=EB=A9=B4=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/ladder/ui/ResultView.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/nextstep/ladder/ui/ResultView.java diff --git a/src/main/java/nextstep/ladder/ui/ResultView.java b/src/main/java/nextstep/ladder/ui/ResultView.java new file mode 100644 index 0000000000..8040b01d57 --- /dev/null +++ b/src/main/java/nextstep/ladder/ui/ResultView.java @@ -0,0 +1,50 @@ +package nextstep.ladder.ui; + +import nextstep.ladder.common.util.ColumnPrinter; +import nextstep.ladder.common.util.RowLinePrinter; +import nextstep.ladder.domain.line.Line; +import nextstep.ladder.domain.line.Lines; + +import java.util.Arrays; + +public class ResultView { + private final String[] participants; + private final Lines lines; + + public ResultView(String[] participants, Lines lines) { + this.participants = participants; + this.lines = lines; + } + + public void showResult() { + System.out.println(""); + System.out.println("실행 결과"); + printParticipants(); + printResult(); + } + + private void printParticipants() { + Arrays.stream(participants) + .forEach(name -> System.out.print(name + " ")); + System.out.println(""); + } + + private void printResult() { + for (Line line : lines.getLineList()) { + printLadderByOneLine(line); + System.out.println(""); + } + } + + private void printLadderByOneLine(Line line) { + int rowLineNumber = participants.length - 1; + System.out.print(ColumnPrinter.generate()); + for (int index = 0; index < rowLineNumber; index++) { + if (line.isTruePosition(index)) { + System.out.print(RowLinePrinter.generate(true) + ColumnPrinter.generate()); + continue; + } + System.out.print(RowLinePrinter.generate(false) + "|"); + } + } +} From fdfd1aa29de27d6e15231b51d196ae96acaafa2b Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Fri, 1 Dec 2023 01:09:19 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[step2]=20refactor:=20Controller=20?= =?UTF-8?q?=EB=B0=8F=20Service=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/application/LadderController.java | 4 ++++ .../ladder/application/dto/LadderRequest.java | 20 +++++++++++++++++++ .../application/dto/LadderResponse.java | 16 +++++++++++++++ .../application/service/LadderService.java | 9 +++++++-- 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/main/java/nextstep/ladder/application/dto/LadderRequest.java create mode 100644 src/main/java/nextstep/ladder/application/dto/LadderResponse.java diff --git a/src/main/java/nextstep/ladder/application/LadderController.java b/src/main/java/nextstep/ladder/application/LadderController.java index ff2538ff2f..b5e64f9bb1 100644 --- a/src/main/java/nextstep/ladder/application/LadderController.java +++ b/src/main/java/nextstep/ladder/application/LadderController.java @@ -4,6 +4,7 @@ import nextstep.ladder.application.dto.LadderResponse; import nextstep.ladder.application.service.LadderService; import nextstep.ladder.ui.InputView; +import nextstep.ladder.ui.ResultView; public class LadderController { @@ -14,6 +15,9 @@ public static void main(String[] args) { LadderService ladderService = new LadderService(); LadderResponse response = ladderService.createLadder(new LadderRequest(participants, highCount)); + + ResultView resultView = new ResultView(participants, response.getLines()); + resultView.showResult(); } private static String[] splitParticipants(InputView inputView) { diff --git a/src/main/java/nextstep/ladder/application/dto/LadderRequest.java b/src/main/java/nextstep/ladder/application/dto/LadderRequest.java new file mode 100644 index 0000000000..bff38cc241 --- /dev/null +++ b/src/main/java/nextstep/ladder/application/dto/LadderRequest.java @@ -0,0 +1,20 @@ +package nextstep.ladder.application.dto; + + +public class LadderRequest { + private String[] participants; + private int highCount; + + public LadderRequest(String[] participants, int highCount) { + this.participants = participants; + this.highCount = highCount; + } + + public String[] getParticipants() { + return participants; + } + + public int getHighCount() { + return highCount; + } +} diff --git a/src/main/java/nextstep/ladder/application/dto/LadderResponse.java b/src/main/java/nextstep/ladder/application/dto/LadderResponse.java new file mode 100644 index 0000000000..42fc05b86d --- /dev/null +++ b/src/main/java/nextstep/ladder/application/dto/LadderResponse.java @@ -0,0 +1,16 @@ +package nextstep.ladder.application.dto; + +import nextstep.ladder.domain.line.Lines; + + +public class LadderResponse { + private final Lines lines; + + public LadderResponse(Lines lines) { + this.lines = lines; + } + + public Lines getLines() { + return lines; + } +} diff --git a/src/main/java/nextstep/ladder/application/service/LadderService.java b/src/main/java/nextstep/ladder/application/service/LadderService.java index d23d66bc6f..2fcc354b74 100644 --- a/src/main/java/nextstep/ladder/application/service/LadderService.java +++ b/src/main/java/nextstep/ladder/application/service/LadderService.java @@ -6,13 +6,18 @@ import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; +import java.util.stream.IntStream; + public class LadderService { public LadderResponse createLadder(LadderRequest request) { + // Delete CalculatorFactory factory = new CalculatorFactory(request.getParticipants()); + Lines lines = new Lines(request.getHighCount()); - lines.addLineByHighCount(new Line(factory)); + IntStream.range(0, request.getHighCount()) + .forEach(index -> lines.addLine(new Line(request.getParticipants()))); - return null; + return new LadderResponse(lines); } } From f0368e13882c755210b5eb5b051f48a8e92b0faa Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Fri, 1 Dec 2023 11:21:15 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[step2]=20refactor:=20=EC=82=AC=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=9C=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/application/LadderController.java | 4 +- .../application/service/LadderService.java | 4 -- .../ladder/common/util/ColumnPrinter.java | 10 ---- .../ladder/common/util/RowLinePrinter.java | 11 ----- .../domain/calculator/CalculatorFactory.java | 14 ------ .../domain/calculator/ColumnCalculator.java | 9 ---- .../calculator/LineCountCalculator.java | 6 --- .../domain/calculator/RowCalculator.java | 15 ------ .../nextstep/ladder/domain/line/Line.java | 14 ++++-- .../nextstep/ladder/domain/line/Lines.java | 17 ++++--- .../ladder/domain/line/RowLinePositions.java | 49 +++++++++++++++++++ .../java/nextstep/ladder/ui/LinePrinter.java | 24 +++++++++ .../java/nextstep/ladder/ui/ResultView.java | 11 ++--- .../ladder/common/util/ColumnPrinterTest.java | 13 ----- .../common/util/RowLinePrinterTest.java | 13 ----- .../ladder/domain/CalculatorFactoryTest.java | 18 ------- .../java/nextstep/ladder/domain/LineTest.java | 4 +- .../nextstep/ladder/domain/LinesTest.java | 4 +- .../ladder/domain/RowLinePositionsTest.java | 33 +++++++++++++ 19 files changed, 139 insertions(+), 134 deletions(-) delete mode 100644 src/main/java/nextstep/ladder/common/util/ColumnPrinter.java delete mode 100644 src/main/java/nextstep/ladder/common/util/RowLinePrinter.java delete mode 100644 src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java delete mode 100644 src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java delete mode 100644 src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java delete mode 100644 src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java create mode 100644 src/main/java/nextstep/ladder/domain/line/RowLinePositions.java create mode 100644 src/main/java/nextstep/ladder/ui/LinePrinter.java delete mode 100644 src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java delete mode 100644 src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java delete mode 100644 src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java create mode 100644 src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java diff --git a/src/main/java/nextstep/ladder/application/LadderController.java b/src/main/java/nextstep/ladder/application/LadderController.java index b5e64f9bb1..dfa5cb07b3 100644 --- a/src/main/java/nextstep/ladder/application/LadderController.java +++ b/src/main/java/nextstep/ladder/application/LadderController.java @@ -3,6 +3,7 @@ import nextstep.ladder.application.dto.LadderRequest; import nextstep.ladder.application.dto.LadderResponse; import nextstep.ladder.application.service.LadderService; +import nextstep.ladder.ui.LinePrinter; import nextstep.ladder.ui.InputView; import nextstep.ladder.ui.ResultView; @@ -16,7 +17,8 @@ public static void main(String[] args) { LadderService ladderService = new LadderService(); LadderResponse response = ladderService.createLadder(new LadderRequest(participants, highCount)); - ResultView resultView = new ResultView(participants, response.getLines()); + LinePrinter printer = new LinePrinter(highCount); + ResultView resultView = new ResultView(printer, participants, response.getLines()); resultView.showResult(); } diff --git a/src/main/java/nextstep/ladder/application/service/LadderService.java b/src/main/java/nextstep/ladder/application/service/LadderService.java index 2fcc354b74..5a07e40b52 100644 --- a/src/main/java/nextstep/ladder/application/service/LadderService.java +++ b/src/main/java/nextstep/ladder/application/service/LadderService.java @@ -2,7 +2,6 @@ import nextstep.ladder.application.dto.LadderRequest; import nextstep.ladder.application.dto.LadderResponse; -import nextstep.ladder.domain.calculator.CalculatorFactory; import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; @@ -11,9 +10,6 @@ public class LadderService { public LadderResponse createLadder(LadderRequest request) { - // Delete - CalculatorFactory factory = new CalculatorFactory(request.getParticipants()); - Lines lines = new Lines(request.getHighCount()); IntStream.range(0, request.getHighCount()) .forEach(index -> lines.addLine(new Line(request.getParticipants()))); diff --git a/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java b/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java deleted file mode 100644 index f3d1e6964a..0000000000 --- a/src/main/java/nextstep/ladder/common/util/ColumnPrinter.java +++ /dev/null @@ -1,10 +0,0 @@ -package nextstep.ladder.common.util; - -public class ColumnPrinter { - - private static final String SIGN = "|"; - - public static String generate() { - return SIGN; - } -} diff --git a/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java b/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java deleted file mode 100644 index 7658f479af..0000000000 --- a/src/main/java/nextstep/ladder/common/util/RowLinePrinter.java +++ /dev/null @@ -1,11 +0,0 @@ -package nextstep.ladder.common.util; - -public class RowLinePrinter { - - private static final String SIGN = "-"; - private static final int COUNT = 5; - - public static String generate() { - return SIGN.repeat(COUNT); - } -} diff --git a/src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java b/src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java deleted file mode 100644 index 86e608f96c..0000000000 --- a/src/main/java/nextstep/ladder/domain/calculator/CalculatorFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package nextstep.ladder.domain.calculator; - -public class CalculatorFactory { - - private static final String ROW = "ROW"; - private static final String COLUMN = "COLUMN"; - - public int calculate(String type, int participantCount) { - if (type.equals(ROW)) { - return new RowCalculator().calculate(participantCount); - } - return new ColumnCalculator().calculate(participantCount); - } -} diff --git a/src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java deleted file mode 100644 index 5dc715055c..0000000000 --- a/src/main/java/nextstep/ladder/domain/calculator/ColumnCalculator.java +++ /dev/null @@ -1,9 +0,0 @@ -package nextstep.ladder.domain.calculator; - -public class ColumnCalculator implements LineCountCalculator { - - @Override - public int calculate(int participantCount) { - return participantCount; - } -} diff --git a/src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java deleted file mode 100644 index 6cd98e6799..0000000000 --- a/src/main/java/nextstep/ladder/domain/calculator/LineCountCalculator.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.ladder.domain.calculator; - -public interface LineCountCalculator { - - int calculate(int participantCount); -} diff --git a/src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java b/src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java deleted file mode 100644 index c1ff5d16bd..0000000000 --- a/src/main/java/nextstep/ladder/domain/calculator/RowCalculator.java +++ /dev/null @@ -1,15 +0,0 @@ -package nextstep.ladder.domain.calculator; - -import nextstep.ladder.domain.calculator.LineCountCalculator; - -import java.util.Random; - -public class RowCalculator implements LineCountCalculator { - - private Random random = new Random(); - - @Override - public int calculate(int participantCount) { - return random.nextInt(participantCount); - } -} diff --git a/src/main/java/nextstep/ladder/domain/line/Line.java b/src/main/java/nextstep/ladder/domain/line/Line.java index d6f14cbce2..95d1849730 100644 --- a/src/main/java/nextstep/ladder/domain/line/Line.java +++ b/src/main/java/nextstep/ladder/domain/line/Line.java @@ -1,11 +1,15 @@ package nextstep.ladder.domain.line; public class Line { - private int rowLineCount; - private int columnLineCount; + private RowLinePositions rowLinePosition; - public Line(int rowLineCount, int columnLineCount) { - this.rowLineCount = rowLineCount; - this.columnLineCount = columnLineCount; + public Line(String[] participants) { + int participantNumber = participants.length; + int rowLineNumber = participantNumber - 1; + rowLinePosition = new RowLinePositions(rowLineNumber); + } + + public boolean isTruePosition(int index) { + return rowLinePosition.isTrue(index); } } diff --git a/src/main/java/nextstep/ladder/domain/line/Lines.java b/src/main/java/nextstep/ladder/domain/line/Lines.java index 662f1896c7..1a7939d6a3 100644 --- a/src/main/java/nextstep/ladder/domain/line/Lines.java +++ b/src/main/java/nextstep/ladder/domain/line/Lines.java @@ -1,20 +1,25 @@ package nextstep.ladder.domain.line; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.IntStream; public class Lines { - private List lineList; + private List lineList = new ArrayList<>(); + private int highCount; - public Lines() { - lineList = new ArrayList<>(); - } + public Lines() {} - public Lines(List lineList) { - this.lineList = lineList; + public Lines(int highCount) { + this.highCount = highCount; } public void addLine(Line line) { lineList.add(line); } + + public final List getLineList() { + return Collections.unmodifiableList(lineList); + } } diff --git a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java new file mode 100644 index 0000000000..0199db55f6 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java @@ -0,0 +1,49 @@ +package nextstep.ladder.domain.line; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.stream.IntStream; + +public class RowLinePositions { + private List positionList = new ArrayList<>(); + private int rowLineCount; + private Random random = new Random(); + + public RowLinePositions(int rowLineCount) { + this.rowLineCount = rowLineCount; + initializePositionList(); + } + + private void initializePositionList() { + positionList.add(random.nextBoolean()); + IntStream.range(1, rowLineCount) + .forEach(index -> addRandomBoolean(index)); + addTrueIfAllFalse(); + } + + private void addRandomBoolean(int index) { + if (positionList.get(index - 1)) { + positionList.add(false); + return; + } + positionList.add(random.nextBoolean()); + } + + private void addTrueIfAllFalse() { + boolean isAllFalse = positionList.stream() + .allMatch(e -> e.equals(Boolean.FALSE)); + if (isAllFalse) { + positionList.set(random.nextInt(rowLineCount), Boolean.TRUE); + } + } + + public boolean isTrue(int index) { + return positionList.get(index); + } + + public final List getPositionList() { + return Collections.unmodifiableList(positionList); + } +} diff --git a/src/main/java/nextstep/ladder/ui/LinePrinter.java b/src/main/java/nextstep/ladder/ui/LinePrinter.java new file mode 100644 index 0000000000..b6d991bd1b --- /dev/null +++ b/src/main/java/nextstep/ladder/ui/LinePrinter.java @@ -0,0 +1,24 @@ +package nextstep.ladder.ui; + +public class LinePrinter { + + private final String COLUMN_SIGN = "|"; + private final String ROW_SIGN = "-"; + private final String EMPTY_ROW_SIGN = " "; + private int repeatNumber; + + /** + * repeatNumber -> highCount + */ + public LinePrinter(int repeatNumber) { + this.repeatNumber = repeatNumber; + } + + public void printRefactoring(boolean isTruePosition) { + if (isTruePosition) { + System.out.print(ROW_SIGN.repeat(repeatNumber) + COLUMN_SIGN); + return; + } + System.out.print(EMPTY_ROW_SIGN.repeat(repeatNumber) + COLUMN_SIGN); + } +} diff --git a/src/main/java/nextstep/ladder/ui/ResultView.java b/src/main/java/nextstep/ladder/ui/ResultView.java index 8040b01d57..ad8d251842 100644 --- a/src/main/java/nextstep/ladder/ui/ResultView.java +++ b/src/main/java/nextstep/ladder/ui/ResultView.java @@ -1,17 +1,18 @@ package nextstep.ladder.ui; import nextstep.ladder.common.util.ColumnPrinter; -import nextstep.ladder.common.util.RowLinePrinter; import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; import java.util.Arrays; public class ResultView { + private LinePrinter printer; private final String[] participants; private final Lines lines; - public ResultView(String[] participants, Lines lines) { + public ResultView(LinePrinter printer, String[] participants, Lines lines) { + this.printer = printer; this.participants = participants; this.lines = lines; } @@ -40,11 +41,7 @@ private void printLadderByOneLine(Line line) { int rowLineNumber = participants.length - 1; System.out.print(ColumnPrinter.generate()); for (int index = 0; index < rowLineNumber; index++) { - if (line.isTruePosition(index)) { - System.out.print(RowLinePrinter.generate(true) + ColumnPrinter.generate()); - continue; - } - System.out.print(RowLinePrinter.generate(false) + "|"); + printer.printRefactoring(line.isTruePosition(index)); } } } diff --git a/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java b/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java deleted file mode 100644 index 532a79823c..0000000000 --- a/src/test/java/nextstep/ladder/common/util/ColumnPrinterTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package nextstep.ladder.common.util; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("사다리 세로 선 출력기 테스트") -public class ColumnPrinterTest { - - @Test - void generate() { - System.out.println("generate : " + ColumnPrinter.generate()); - } -} diff --git a/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java b/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java deleted file mode 100644 index 37807375cf..0000000000 --- a/src/test/java/nextstep/ladder/common/util/RowLinePrinterTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package nextstep.ladder.common.util; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("사다리 가로 선 출력기 테스트") -public class RowLinePrinterTest { - - @Test - void generate() { - System.out.println("generate : " + RowLinePrinter.generate()); - } -} diff --git a/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java b/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java deleted file mode 100644 index d1f5ef27e5..0000000000 --- a/src/test/java/nextstep/ladder/domain/CalculatorFactoryTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package nextstep.ladder.domain; - -import nextstep.ladder.domain.calculator.CalculatorFactory; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("라인 개수를 구하는 객체 생성 팩토리 테스트") -public class CalculatorFactoryTest { - - @DisplayName("참가자 수에 따라 가로, 세로 라인의 개수를 구한다.") - @Test - void calculate() { - int participantCount = 4; - Assertions.assertThat(new CalculatorFactory().calculate("ROW", participantCount)).isLessThan(4); - Assertions.assertThat(new CalculatorFactory().calculate("COLUMN", participantCount)).isEqualTo(participantCount); - } -} diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java index d031d7e6cc..066d4fc4fc 100644 --- a/src/test/java/nextstep/ladder/domain/LineTest.java +++ b/src/test/java/nextstep/ladder/domain/LineTest.java @@ -8,9 +8,11 @@ @DisplayName("하나의 사다리 라인 테스트") public class LineTest { + private String[] participants = {"pobi","honux","crong","jk"}; + @DisplayName("사다리들을 가지고 있는 하나의 라인 객체를 생성한다.") @Test void line() { - Assertions.assertThat(new Line(4,2)).isInstanceOf(Line.class); + Assertions.assertThat(new Line(participants)).isInstanceOf(Line.class); } } diff --git a/src/test/java/nextstep/ladder/domain/LinesTest.java b/src/test/java/nextstep/ladder/domain/LinesTest.java index 2ccf767e0f..f00ef53f16 100644 --- a/src/test/java/nextstep/ladder/domain/LinesTest.java +++ b/src/test/java/nextstep/ladder/domain/LinesTest.java @@ -8,10 +8,12 @@ @DisplayName("라인 일급 컬렉션 테스트") public class LinesTest { + private String[] participants = {"pobi","honux","crong","jk"}; + @DisplayName("라인 객체를 추가한다.") @Test void addLine() { Lines lines = new Lines(); - lines.addLine(new Line(1,1)); + lines.addLine(new Line(participants)); } } diff --git a/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java b/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java new file mode 100644 index 0000000000..380c7a8966 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java @@ -0,0 +1,33 @@ +package nextstep.ladder.domain; + +import nextstep.ladder.domain.line.RowLinePositions; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +@DisplayName("가로 선 위치 테스트") +public class RowLinePositionsTest { + + @DisplayName("가로선의 위치가 연속적으로 true인지 확인한다.") + @Test + void printRowLinePositionsList() { + System.out.println("START"); + RowLinePositions positions = new RowLinePositions(3); + positions.getPositionList() + .stream() + .forEach(element -> System.out.println("result : " + element)); + System.out.println("END"); + } + + @DisplayName("모든 값이 거짓일 때 참을 반환한다.") + @Test + void lastCheck() { + List givenValues = Arrays.asList(Boolean.FALSE, Boolean.FALSE, Boolean.FALSE); + boolean result = givenValues.stream() + .allMatch(e -> e.equals(Boolean.FALSE)); + Assertions.assertThat(result).isTrue(); + } +} From 0262c6a73260d2da40a97e77bf91c2b981d72a79 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Fri, 1 Dec 2023 11:22:44 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[step2]=20fix:=20=EC=BB=B4=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/ui/ResultView.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/nextstep/ladder/ui/ResultView.java b/src/main/java/nextstep/ladder/ui/ResultView.java index ad8d251842..0da0fee1f8 100644 --- a/src/main/java/nextstep/ladder/ui/ResultView.java +++ b/src/main/java/nextstep/ladder/ui/ResultView.java @@ -1,6 +1,5 @@ package nextstep.ladder.ui; -import nextstep.ladder.common.util.ColumnPrinter; import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; @@ -39,7 +38,7 @@ private void printResult() { private void printLadderByOneLine(Line line) { int rowLineNumber = participants.length - 1; - System.out.print(ColumnPrinter.generate()); + System.out.print("|"); for (int index = 0; index < rowLineNumber; index++) { printer.printRefactoring(line.isTruePosition(index)); } From 73d70b160c24a2c8e7a81d3cb6bcd0a45004237d Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sat, 2 Dec 2023 02:08:04 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[step2]=20refactor:=20step1=20PR=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++------- .../ladder/application/LadderController.java | 7 +----- .../nextstep/ladder/domain/line/Line.java | 2 +- .../ladder/domain/line/RowLinePositions.java | 22 ++++++++++++------- .../java/nextstep/ladder/ui/InputView.java | 4 ++++ .../ladder/domain/RowLinePositionsTest.java | 2 +- 6 files changed, 29 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 62e8235761..7fb76d5f87 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # 사디리 ## 기능 요구사항 -* 사다리 게임에 참여하는 사람에 이름을 부여할 수 있다. - * 이름은 최대 5글자로 제한된다. - * 사람의 이름은 띄어쓰기가 존재하지 않는 쉼표로 구분한다. -* 사다리의 모양은 |-----|으로 출력된다. - * 사다리를 출력할 때 사람 이름도 같이 출력한다. - * 참여하는 사람의 숫자에 따라 사다리의 폭과 사다리의 개수가 달라진다. - * |-----|-----| 같이 연속적인 사다리는 가능하지 않다. - * 하나의 라인에는 최소 하나 이상이 사다리가 존재하며 사다리의 개수는 랜덤하다. +[] 사다리 게임에 참여하는 사람에 이름을 부여할 수 있다. + [] 이름은 최대 5글자로 제한된다. + [] 사람의 이름은 띄어쓰기가 존재하지 않는 쉼표로 구분한다. +[] 사다리의 모양은 |-----|으로 출력된다. + [] 사다리를 출력할 때 사람 이름도 같이 출력한다. + [] 참여하는 사람의 숫자에 따라 사다리의 폭과 사다리의 개수가 달라진다. + [] |-----|-----| 같이 연속적인 사다리는 가능하지 않다. + [] 하나의 라인에는 최소 하나 이상이 사다리가 존재하며 사다리의 개수는 랜덤하다. ## 프로그래밍 요구사항 * 최대한 자바 8의 스트림과 람다를 이용한다. diff --git a/src/main/java/nextstep/ladder/application/LadderController.java b/src/main/java/nextstep/ladder/application/LadderController.java index dfa5cb07b3..cd4153ddbd 100644 --- a/src/main/java/nextstep/ladder/application/LadderController.java +++ b/src/main/java/nextstep/ladder/application/LadderController.java @@ -11,7 +11,7 @@ public class LadderController { public static void main(String[] args) { InputView inputView = new InputView(); - String[] participants = splitParticipants(inputView); + String[] participants = inputView.splitParticipants(inputView.inputParticipant()); int highCount = inputView.inputHighCount(); LadderService ladderService = new LadderService(); @@ -21,9 +21,4 @@ public static void main(String[] args) { ResultView resultView = new ResultView(printer, participants, response.getLines()); resultView.showResult(); } - - private static String[] splitParticipants(InputView inputView) { - return inputView.inputParticipant() - .split(","); - } } diff --git a/src/main/java/nextstep/ladder/domain/line/Line.java b/src/main/java/nextstep/ladder/domain/line/Line.java index 95d1849730..a2c1f94549 100644 --- a/src/main/java/nextstep/ladder/domain/line/Line.java +++ b/src/main/java/nextstep/ladder/domain/line/Line.java @@ -6,7 +6,7 @@ public class Line { public Line(String[] participants) { int participantNumber = participants.length; int rowLineNumber = participantNumber - 1; - rowLinePosition = new RowLinePositions(rowLineNumber); + rowLinePosition = RowLinePositions.create(rowLineNumber); } public boolean isTruePosition(int index) { diff --git a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java index 0199db55f6..e749ff3564 100644 --- a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java +++ b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java @@ -9,21 +9,27 @@ public class RowLinePositions { private List positionList = new ArrayList<>(); private int rowLineCount; - private Random random = new Random(); + private static final Random random = new Random(); - public RowLinePositions(int rowLineCount) { + public RowLinePositions(List positionList, int rowLineCount) { + this.positionList = positionList; this.rowLineCount = rowLineCount; - initializePositionList(); } - private void initializePositionList() { + public static RowLinePositions create(int rowLineCount) { + List positionList = new ArrayList<>(); + initializePositionList(positionList, rowLineCount); + return new RowLinePositions(positionList, rowLineCount); + } + + private static void initializePositionList(List positionList, int rowLineCount) { positionList.add(random.nextBoolean()); IntStream.range(1, rowLineCount) - .forEach(index -> addRandomBoolean(index)); - addTrueIfAllFalse(); + .forEach(index -> addRandomBoolean(positionList, index)); + addTrueIfAllFalse(positionList, rowLineCount); } - private void addRandomBoolean(int index) { + private static void addRandomBoolean(List positionList, int index) { if (positionList.get(index - 1)) { positionList.add(false); return; @@ -31,7 +37,7 @@ private void addRandomBoolean(int index) { positionList.add(random.nextBoolean()); } - private void addTrueIfAllFalse() { + private static void addTrueIfAllFalse(List positionList, int rowLineCount) { boolean isAllFalse = positionList.stream() .allMatch(e -> e.equals(Boolean.FALSE)); if (isAllFalse) { diff --git a/src/main/java/nextstep/ladder/ui/InputView.java b/src/main/java/nextstep/ladder/ui/InputView.java index 22cd8485ec..195d895db8 100644 --- a/src/main/java/nextstep/ladder/ui/InputView.java +++ b/src/main/java/nextstep/ladder/ui/InputView.java @@ -11,6 +11,10 @@ public String inputParticipant() { return scanner.nextLine(); } + public String[] splitParticipants(String participants) { + return participants.split(","); + } + public int inputHighCount() { printEmpty(); System.out.println("최대 사다리 높이는 몇 개인가요?"); diff --git a/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java b/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java index 380c7a8966..5c7c026c04 100644 --- a/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java +++ b/src/test/java/nextstep/ladder/domain/RowLinePositionsTest.java @@ -15,7 +15,7 @@ public class RowLinePositionsTest { @Test void printRowLinePositionsList() { System.out.println("START"); - RowLinePositions positions = new RowLinePositions(3); + RowLinePositions positions = RowLinePositions.create(3); positions.getPositionList() .stream() .forEach(element -> System.out.println("result : " + element)); From cc08a710ae33fd6844137e30ea0e136f052576ea Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:25:44 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[step3]=20test:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/ladder/domain/LineTest.java | 15 ++++++++++ .../ladder/domain/ParticipantsTest.java | 29 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/test/java/nextstep/ladder/domain/ParticipantsTest.java diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java index 066d4fc4fc..253ca621e6 100644 --- a/src/test/java/nextstep/ladder/domain/LineTest.java +++ b/src/test/java/nextstep/ladder/domain/LineTest.java @@ -1,9 +1,12 @@ package nextstep.ladder.domain; import nextstep.ladder.domain.line.Line; +import nextstep.ladder.domain.line.RowLinePositions; +import nextstep.ladder.domain.participant.Participant; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; @DisplayName("하나의 사다리 라인 테스트") public class LineTest { @@ -15,4 +18,16 @@ public class LineTest { void line() { Assertions.assertThat(new Line(participants)).isInstanceOf(Line.class); } + + @Test + void moveParticipant() { + Participant participant = new Participant("muel", 0); + RowLinePositions positions = new RowLinePositions( + List.of(Boolean.TRUE, Boolean.TRUE, Boolean.TRUE), + 3); + Line line = new Line(3, positions); + line.movableParticipant(participant); + + System.out.println(participant); + } } diff --git a/src/test/java/nextstep/ladder/domain/ParticipantsTest.java b/src/test/java/nextstep/ladder/domain/ParticipantsTest.java new file mode 100644 index 0000000000..614d790354 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/ParticipantsTest.java @@ -0,0 +1,29 @@ +package nextstep.ladder.domain; + +import nextstep.ladder.domain.participant.Participant; +import nextstep.ladder.domain.participant.Participants; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import java.util.List; + +public class ParticipantsTest { + + public static final Participant P1 = new Participant("kwon", 0); + public static final Participant P2 = new Participant("muel", 1); + public static final Participants PARTICIPANTS = new Participants(List.of(P1, P2)); + + @Test + void 생성자() { + String[] givenData = {"park", "sang", "kwom"}; + Participants participants = Participants.of(givenData); + participants.getParticipantList() + .stream() + .forEach(participant -> System.out.print(participant)); + } + + @Test + void equal() { + Participant participant = new Participant("kwon",2); + Assertions.assertThat(P1.equals(participant)).isTrue(); + } +} From 70a7d0f092286b1b6b79e993193bcaa68229b43d Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:27:07 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[step3]=20feature:=20=EC=B0=B8=EA=B0=80?= =?UTF-8?q?=EC=9E=90=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/ladder/domain/line/Line.java | 58 ++++++++++++++++++- .../nextstep/ladder/domain/line/Lines.java | 13 +++-- .../domain/participant/Participant.java | 42 ++++++++++++++ .../domain/participant/Participants.java | 41 +++++++++++++ 4 files changed, 147 insertions(+), 7 deletions(-) create mode 100644 src/main/java/nextstep/ladder/domain/participant/Participant.java create mode 100644 src/main/java/nextstep/ladder/domain/participant/Participants.java diff --git a/src/main/java/nextstep/ladder/domain/line/Line.java b/src/main/java/nextstep/ladder/domain/line/Line.java index a2c1f94549..a882a94d0f 100644 --- a/src/main/java/nextstep/ladder/domain/line/Line.java +++ b/src/main/java/nextstep/ladder/domain/line/Line.java @@ -1,15 +1,71 @@ package nextstep.ladder.domain.line; +import nextstep.ladder.domain.participant.Participant; +import nextstep.ladder.domain.participant.Participants; + public class Line { + private final int rowLineNumber; private RowLinePositions rowLinePosition; + // Refactoring method public Line(String[] participants) { int participantNumber = participants.length; - int rowLineNumber = participantNumber - 1; + rowLineNumber = participantNumber - 1; + rowLinePosition = RowLinePositions.create(rowLineNumber); + } + + // New method + // rowLineNumber == participants.length - 1 + public Line(int rowLineNumber) { + this.rowLineNumber = rowLineNumber; rowLinePosition = RowLinePositions.create(rowLineNumber); } + public Line(int rowLineNumber, RowLinePositions rowLinePositions) { + this.rowLineNumber = rowLineNumber; + this.rowLinePosition = rowLinePositions; + } + public boolean isTruePosition(int index) { return rowLinePosition.isTrue(index); } + + public void movableParticipants(Participants participants) { + participants.getParticipantList() + .stream() + .forEachOrdered(participant -> movableParticipant(participant)); + } + + public void movableParticipant(Participant participant) { + if (participant.getCurrentIndex() == rowLineNumber) { + movableLeft(participant); + return; + } + if (movableLeft(participant)) { + return; + } + movableRight(participant); + } + + private boolean movableLeft(Participant participant) { + int index = participant.getCurrentIndex(); + if (index != 0 && isTruePosition(index -1)) { + participant.moveLeft(); + return true; + } + return false; + } + + private boolean movableRight(Participant participant) { + int index = participant.getCurrentIndex(); + /** + * Fix + * - rowLineNumber가 3일 때, index != rowLineNumber로 설정할 경우 index + 1에서 예외 발생 + */ + if (index != rowLineNumber && isTruePosition(index)) { + participant.moveRight(); + return true; + } + return false; + } } diff --git a/src/main/java/nextstep/ladder/domain/line/Lines.java b/src/main/java/nextstep/ladder/domain/line/Lines.java index 1a7939d6a3..086476967b 100644 --- a/src/main/java/nextstep/ladder/domain/line/Lines.java +++ b/src/main/java/nextstep/ladder/domain/line/Lines.java @@ -1,24 +1,25 @@ package nextstep.ladder.domain.line; +import nextstep.ladder.domain.participant.Participants; + import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.IntStream; public class Lines { private List lineList = new ArrayList<>(); - private int highCount; public Lines() {} - public Lines(int highCount) { - this.highCount = highCount; - } - public void addLine(Line line) { lineList.add(line); } + public void moveParticipants(Participants participants) { + lineList.stream() + .forEachOrdered(line -> line.movableParticipants(participants)); + } + public final List getLineList() { return Collections.unmodifiableList(lineList); } diff --git a/src/main/java/nextstep/ladder/domain/participant/Participant.java b/src/main/java/nextstep/ladder/domain/participant/Participant.java new file mode 100644 index 0000000000..d096b0fde0 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/participant/Participant.java @@ -0,0 +1,42 @@ +package nextstep.ladder.domain.participant; + + +public class Participant { + private String name; + private int currentIndex; + private String result; + + public Participant(String name, int currentIndex) { + this.name = name; + this.currentIndex = currentIndex; + } + + public void moveLeft() { + currentIndex -= 1; + } + + public void moveRight() { + currentIndex += 1; + } + + public void insertResult(String[] results) { + result = results[currentIndex]; + } + + public String getName() { + return name; + } + + public final int getCurrentIndex() { + return currentIndex; + } + + public String getResult() { + return result; + } + + @Override + public String toString() { + return "{name:" + name + "}" + "{currentPosition:" + currentIndex + "}" + "|"; + } +} diff --git a/src/main/java/nextstep/ladder/domain/participant/Participants.java b/src/main/java/nextstep/ladder/domain/participant/Participants.java new file mode 100644 index 0000000000..64e7ad60a2 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/participant/Participants.java @@ -0,0 +1,41 @@ +package nextstep.ladder.domain.participant; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Participants { + private final List participantList; + + public Participants(List participantList) { + this.participantList = participantList; + } + + public static Participants of(String[] participants) { + List participantList = new ArrayList<>(); + Arrays.stream(participants) + .forEach(participant -> participantList.add(new Participant(participant, participantList.size()))); + return new Participants(participantList); + } + + public void insertMyResult(String[] results) { + participantList.stream() + .forEach(participant -> participant.insertResult(results)); + } + + public Participant findByName(String name) { + return participantList.stream() + .filter(participant -> participant.getName().equals(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Can not find name")); + } + + public int getParticipantsNumber() { + return participantList.size(); + } + + public final List getParticipantList() { + return Collections.unmodifiableList(participantList); + } +} From bdeef4fbfa0aed401d86cef9e72be0a133acc3b5 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:29:17 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[step3]=20feature:=20Controller=20?= =?UTF-8?q?=EB=B0=8F=20Service=EC=97=90=20=EA=B2=8C=EC=9E=84=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/application/LadderController.java | 18 ++++++++++++++---- .../ladder/application/dto/LadderRequest.java | 8 +++++++- .../application/dto/LadderResponse.java | 13 ++++++++++--- .../application/service/LadderService.java | 19 ++++++++++++++----- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/main/java/nextstep/ladder/application/LadderController.java b/src/main/java/nextstep/ladder/application/LadderController.java index cd4153ddbd..f36a7ce274 100644 --- a/src/main/java/nextstep/ladder/application/LadderController.java +++ b/src/main/java/nextstep/ladder/application/LadderController.java @@ -11,14 +11,24 @@ public class LadderController { public static void main(String[] args) { InputView inputView = new InputView(); - String[] participants = inputView.splitParticipants(inputView.inputParticipant()); + String[] participants = inputView.inputParticipant(); + String[] results = inputView.inputResults(); int highCount = inputView.inputHighCount(); LadderService ladderService = new LadderService(); - LadderResponse response = ladderService.createLadder(new LadderRequest(participants, highCount)); + LadderResponse createResponse = ladderService.findWinner(new LadderRequest( + participants, + results, + highCount)); LinePrinter printer = new LinePrinter(highCount); - ResultView resultView = new ResultView(printer, participants, response.getLines()); - resultView.showResult(); + ResultView resultView = new ResultView( + printer, + createResponse.getLines(), + createResponse.getParticipants(), + results); + resultView.showLadder(); + resultView.showParticipant(inputView.inputWantShow()); + resultView.showParticipant(inputView.inputWantShow()); } } diff --git a/src/main/java/nextstep/ladder/application/dto/LadderRequest.java b/src/main/java/nextstep/ladder/application/dto/LadderRequest.java index bff38cc241..6c4a9717ac 100644 --- a/src/main/java/nextstep/ladder/application/dto/LadderRequest.java +++ b/src/main/java/nextstep/ladder/application/dto/LadderRequest.java @@ -3,10 +3,12 @@ public class LadderRequest { private String[] participants; + private String[] results; private int highCount; - public LadderRequest(String[] participants, int highCount) { + public LadderRequest(String[] participants, String[] results, int highCount) { this.participants = participants; + this.results = results; this.highCount = highCount; } @@ -14,6 +16,10 @@ public String[] getParticipants() { return participants; } + public String[] getResults() { + return results; + } + public int getHighCount() { return highCount; } diff --git a/src/main/java/nextstep/ladder/application/dto/LadderResponse.java b/src/main/java/nextstep/ladder/application/dto/LadderResponse.java index 42fc05b86d..5385baef87 100644 --- a/src/main/java/nextstep/ladder/application/dto/LadderResponse.java +++ b/src/main/java/nextstep/ladder/application/dto/LadderResponse.java @@ -1,16 +1,23 @@ package nextstep.ladder.application.dto; import nextstep.ladder.domain.line.Lines; +import nextstep.ladder.domain.participant.Participants; public class LadderResponse { - private final Lines lines; + private Lines lines; + private Participants participants; - public LadderResponse(Lines lines) { + public LadderResponse(Lines lines, Participants participants) { this.lines = lines; + this.participants = participants; } - public Lines getLines() { + public final Lines getLines() { return lines; } + + public final Participants getParticipants() { + return participants; + } } diff --git a/src/main/java/nextstep/ladder/application/service/LadderService.java b/src/main/java/nextstep/ladder/application/service/LadderService.java index 5a07e40b52..f442e960ab 100644 --- a/src/main/java/nextstep/ladder/application/service/LadderService.java +++ b/src/main/java/nextstep/ladder/application/service/LadderService.java @@ -4,16 +4,25 @@ import nextstep.ladder.application.dto.LadderResponse; import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; +import nextstep.ladder.domain.participant.Participants; import java.util.stream.IntStream; public class LadderService { - public LadderResponse createLadder(LadderRequest request) { - Lines lines = new Lines(request.getHighCount()); - IntStream.range(0, request.getHighCount()) - .forEach(index -> lines.addLine(new Line(request.getParticipants()))); + public LadderResponse findWinner(LadderRequest request) { + Lines lines = createLines(request); + Participants participants = Participants.of(request.getParticipants()); + lines.moveParticipants(participants); + participants.insertMyResult(request.getResults()); + return new LadderResponse(lines, participants); + } - return new LadderResponse(lines); + private Lines createLines(LadderRequest request) { + Lines lines = new Lines(); + int rowLineNumber = request.getParticipants().length - 1; + IntStream.range(0, request.getHighCount()) + .forEach(index -> lines.addLine(new Line(rowLineNumber))); + return lines; } } From f7462440cc82b339d460f8130d1c8d49bd1729c6 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:30:17 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[step3]=20feature:=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89=20UI=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ladder/domain/line/RowLinePositions.java | 22 ++++---- .../java/nextstep/ladder/ui/InputView.java | 20 ++++++- .../java/nextstep/ladder/ui/ResultView.java | 56 ++++++++++++++++--- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java index e749ff3564..77c5c38763 100644 --- a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java +++ b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java @@ -8,25 +8,25 @@ public class RowLinePositions { private List positionList = new ArrayList<>(); - private int rowLineCount; + private int rowLineNumber; private static final Random random = new Random(); - public RowLinePositions(List positionList, int rowLineCount) { + public RowLinePositions(List positionList, int rowLineNumber) { this.positionList = positionList; - this.rowLineCount = rowLineCount; + this.rowLineNumber = rowLineNumber; } - public static RowLinePositions create(int rowLineCount) { + public static RowLinePositions create(int rowLineNumber) { List positionList = new ArrayList<>(); - initializePositionList(positionList, rowLineCount); - return new RowLinePositions(positionList, rowLineCount); + initializePositionList(positionList, rowLineNumber); + return new RowLinePositions(positionList, rowLineNumber); } - private static void initializePositionList(List positionList, int rowLineCount) { + private static void initializePositionList(List positionList, int rowLineNumber) { positionList.add(random.nextBoolean()); - IntStream.range(1, rowLineCount) + IntStream.range(1, rowLineNumber) .forEach(index -> addRandomBoolean(positionList, index)); - addTrueIfAllFalse(positionList, rowLineCount); + addTrueIfAllFalse(positionList, rowLineNumber); } private static void addRandomBoolean(List positionList, int index) { @@ -37,11 +37,11 @@ private static void addRandomBoolean(List positionList, int index) { positionList.add(random.nextBoolean()); } - private static void addTrueIfAllFalse(List positionList, int rowLineCount) { + private static void addTrueIfAllFalse(List positionList, int rowLineNumber) { boolean isAllFalse = positionList.stream() .allMatch(e -> e.equals(Boolean.FALSE)); if (isAllFalse) { - positionList.set(random.nextInt(rowLineCount), Boolean.TRUE); + positionList.set(random.nextInt(rowLineNumber), Boolean.TRUE); } } diff --git a/src/main/java/nextstep/ladder/ui/InputView.java b/src/main/java/nextstep/ladder/ui/InputView.java index 195d895db8..83fe49b8f4 100644 --- a/src/main/java/nextstep/ladder/ui/InputView.java +++ b/src/main/java/nextstep/ladder/ui/InputView.java @@ -6,12 +6,19 @@ public class InputView { private Scanner scanner = new Scanner(System.in); - public String inputParticipant() { + public String[] inputParticipant() { System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); - return scanner.nextLine(); + String participants = scanner.nextLine(); + return splitBy(participants); } - public String[] splitParticipants(String participants) { + public String[] inputResults() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + String results = scanner.nextLine(); + return splitBy(results); + } + + private String[] splitBy(String participants) { return participants.split(","); } @@ -24,4 +31,11 @@ public int inputHighCount() { private void printEmpty() { System.out.println(""); } + + public String inputWantShow() { + System.out.println(""); + Scanner newScanner = new Scanner(System.in); + System.out.println("결과를 보고 싶은 사람은?"); + return newScanner.nextLine(); + } } diff --git a/src/main/java/nextstep/ladder/ui/ResultView.java b/src/main/java/nextstep/ladder/ui/ResultView.java index 0da0fee1f8..19e5e67608 100644 --- a/src/main/java/nextstep/ladder/ui/ResultView.java +++ b/src/main/java/nextstep/ladder/ui/ResultView.java @@ -2,34 +2,41 @@ import nextstep.ladder.domain.line.Line; import nextstep.ladder.domain.line.Lines; +import nextstep.ladder.domain.participant.Participant; +import nextstep.ladder.domain.participant.Participants; import java.util.Arrays; +import java.util.stream.IntStream; public class ResultView { private LinePrinter printer; - private final String[] participants; private final Lines lines; + private final Participants participants; + private final String[] results; - public ResultView(LinePrinter printer, String[] participants, Lines lines) { + public ResultView(LinePrinter printer, Lines lines, Participants participants, String[] results) { this.printer = printer; - this.participants = participants; this.lines = lines; + this.participants = participants; + this.results = results; } - public void showResult() { + public void showLadder() { System.out.println(""); System.out.println("실행 결과"); printParticipants(); - printResult(); + printLadder(); + printResults(); } private void printParticipants() { - Arrays.stream(participants) - .forEach(name -> System.out.print(name + " ")); + participants.getParticipantList() + .stream() + .forEach(participant -> System.out.print(participant.getName() + " ")); System.out.println(""); } - private void printResult() { + private void printLadder() { for (Line line : lines.getLineList()) { printLadderByOneLine(line); System.out.println(""); @@ -37,10 +44,41 @@ private void printResult() { } private void printLadderByOneLine(Line line) { - int rowLineNumber = participants.length - 1; + int rowLineNumber = participants.getParticipantsNumber() - 1; System.out.print("|"); for (int index = 0; index < rowLineNumber; index++) { printer.printRefactoring(line.isTruePosition(index)); } } + + private void printResults() { + printResult(results[0]); + IntStream.range(1, results.length) + .forEach(index -> printResult(results[index])); + System.out.println(""); + } + + private void printResult(String result) { + if (result.equals("꽝")) { + System.out.print(result + " ".repeat(results.length - 1)); + return; + } + System.out.print(result + " ".repeat(results.length - result.length())); + } + + public void showParticipant(String name) { + System.out.println(""); + if (name.equalsIgnoreCase("all")) { + participants.getParticipantList() + .stream() + .forEach(participant -> printMyResult(participant)); + return; + } + Participant participant = participants.findByName(name); + printMyResult(participant); + } + + private void printMyResult(Participant participant) { + System.out.println(participant.getName() + " : " + participant.getResult()); + } } From 90ab5e40f29d241556ef7c457112cc414c85a490 Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:32:58 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[step3]=20refactor:=20inputView=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/ui/InputView.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/nextstep/ladder/ui/InputView.java b/src/main/java/nextstep/ladder/ui/InputView.java index 83fe49b8f4..775c8b1079 100644 --- a/src/main/java/nextstep/ladder/ui/InputView.java +++ b/src/main/java/nextstep/ladder/ui/InputView.java @@ -9,29 +9,21 @@ public class InputView { public String[] inputParticipant() { System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); String participants = scanner.nextLine(); - return splitBy(participants); + return participants.split(","); } public String[] inputResults() { System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); String results = scanner.nextLine(); - return splitBy(results); - } - - private String[] splitBy(String participants) { - return participants.split(","); + return results.split(","); } public int inputHighCount() { - printEmpty(); + System.out.println(""); System.out.println("최대 사다리 높이는 몇 개인가요?"); return scanner.nextInt(); } - private void printEmpty() { - System.out.println(""); - } - public String inputWantShow() { System.out.println(""); Scanner newScanner = new Scanner(System.in); From c346c8f9d7ec943759f239d652f066ed988d577e Mon Sep 17 00:00:00 2001 From: pawoo0211 Date: Sun, 3 Dec 2023 16:44:59 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[step3]=20refactor:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/domain/line/Line.java | 11 ----------- .../nextstep/ladder/domain/line/RowLinePositions.java | 2 +- .../java/nextstep/ladder/domain/ParticipantsTest.java | 7 ------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/src/main/java/nextstep/ladder/domain/line/Line.java b/src/main/java/nextstep/ladder/domain/line/Line.java index a882a94d0f..3e83860237 100644 --- a/src/main/java/nextstep/ladder/domain/line/Line.java +++ b/src/main/java/nextstep/ladder/domain/line/Line.java @@ -7,15 +7,12 @@ public class Line { private final int rowLineNumber; private RowLinePositions rowLinePosition; - // Refactoring method public Line(String[] participants) { int participantNumber = participants.length; rowLineNumber = participantNumber - 1; rowLinePosition = RowLinePositions.create(rowLineNumber); } - // New method - // rowLineNumber == participants.length - 1 public Line(int rowLineNumber) { this.rowLineNumber = rowLineNumber; rowLinePosition = RowLinePositions.create(rowLineNumber); @@ -37,10 +34,6 @@ public void movableParticipants(Participants participants) { } public void movableParticipant(Participant participant) { - if (participant.getCurrentIndex() == rowLineNumber) { - movableLeft(participant); - return; - } if (movableLeft(participant)) { return; } @@ -58,10 +51,6 @@ private boolean movableLeft(Participant participant) { private boolean movableRight(Participant participant) { int index = participant.getCurrentIndex(); - /** - * Fix - * - rowLineNumber가 3일 때, index != rowLineNumber로 설정할 경우 index + 1에서 예외 발생 - */ if (index != rowLineNumber && isTruePosition(index)) { participant.moveRight(); return true; diff --git a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java index 77c5c38763..7f0d6dcfcb 100644 --- a/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java +++ b/src/main/java/nextstep/ladder/domain/line/RowLinePositions.java @@ -7,7 +7,7 @@ import java.util.stream.IntStream; public class RowLinePositions { - private List positionList = new ArrayList<>(); + private List positionList; private int rowLineNumber; private static final Random random = new Random(); diff --git a/src/test/java/nextstep/ladder/domain/ParticipantsTest.java b/src/test/java/nextstep/ladder/domain/ParticipantsTest.java index 614d790354..e3835b4688 100644 --- a/src/test/java/nextstep/ladder/domain/ParticipantsTest.java +++ b/src/test/java/nextstep/ladder/domain/ParticipantsTest.java @@ -10,7 +10,6 @@ public class ParticipantsTest { public static final Participant P1 = new Participant("kwon", 0); public static final Participant P2 = new Participant("muel", 1); - public static final Participants PARTICIPANTS = new Participants(List.of(P1, P2)); @Test void 생성자() { @@ -20,10 +19,4 @@ public class ParticipantsTest { .stream() .forEach(participant -> System.out.print(participant)); } - - @Test - void equal() { - Participant participant = new Participant("kwon",2); - Assertions.assertThat(P1.equals(participant)).isTrue(); - } }