From b07a49c988cc5b95a80d6ef025e4df38cca02735 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:19:19 +0900 Subject: [PATCH 01/59] =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..8915e946 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +- [ ] 연결 여부는 랜덤으로 결정한다. +- [ ] 사다리는 라인이 겹치지 않아야 한다. From f493a0594c65cb803205486989e08241933ab372 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:20:16 +0900 Subject: [PATCH 02/59] =?UTF-8?q?=20input,=20ouput=20view=20class=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 39 ++++++++++++++++++++++++++++++ src/main/java/view/OutputView.java | 39 ++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..1c0d1958 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,39 @@ +package view; + +import domain.Person; +import domain.Prize; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); + + public List readParticipants() { + String[] participants = scanner.nextLine().split(","); + + return Arrays.stream(participants) + .map(Person::new) + .toList(); + } + + public List readPrizeResults() { + String[] prizes = scanner.nextLine().split(","); + + return Arrays.stream(prizes) + .map(p -> { + if (p.equals("꽝")) + return new Prize(0); + + return new Prize(Integer.parseInt(p)); + }) + .toList(); + + + } + + public int readLadderHeight() { + return scanner.nextInt(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..34e199c2 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,39 @@ +package view; + +import domain.*; + +import java.util.List; + +public class OutputView { + + public void printParticipantInquiry() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + } + + public void printResultPrizeInquiry() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + } + + public void printLadderHeightInquiry() { + System.out.println("최대 사다리 높이는 몇 개인가요?"); + } + + public void printLadderResult(Ladder ladder) { + List lines = ladder.getLines(); + int ladderWidth = lines.size(); + int lineHeight = lines.get(0).getPoints().size(); + + for (int i = 0; i < lineHeight; i++) { + for (int j = 0; j < ladderWidth; j++) { + Direction direction = lines.get(j).getPoints().get(i); + + if (direction == Direction.RIGHT) { + System.out.print("|-----"); + } else { + System.out.print("| "); + } + } + System.out.println(); + } + } +} From 2254785b0424145d1325db81a6b275e54254b13c Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:22:23 +0900 Subject: [PATCH 03/59] =?UTF-8?q?=20=EC=97=B0=EA=B2=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20enum=20class=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Connection.java | 6 ++++++ src/main/java/domain/Direction.java | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 src/main/java/domain/Connection.java create mode 100644 src/main/java/domain/Direction.java diff --git a/src/main/java/domain/Connection.java b/src/main/java/domain/Connection.java new file mode 100644 index 00000000..32c5c2bd --- /dev/null +++ b/src/main/java/domain/Connection.java @@ -0,0 +1,6 @@ +package domain; + +public enum Connection { + CONNECTED, + UNCONNECTED, +} diff --git a/src/main/java/domain/Direction.java b/src/main/java/domain/Direction.java new file mode 100644 index 00000000..9a015757 --- /dev/null +++ b/src/main/java/domain/Direction.java @@ -0,0 +1,5 @@ +package domain; + +public enum Direction { + LEFT, RIGHT, DOWN +} From e0ffcfba3315d6ebfcb5b6b52b8196bd9161b621 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:22:43 +0900 Subject: [PATCH 04/59] =?UTF-8?q?=20controller=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/LadderGameController.java diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java new file mode 100644 index 00000000..d208ee67 --- /dev/null +++ b/src/main/java/LadderGameController.java @@ -0,0 +1,38 @@ +import domain.Ladder; +import domain.Person; +import domain.Prize; +import view.InputView; +import view.OutputView; + +import java.util.List; + +public class LadderGameController { + + private final InputView inputView; + private final OutputView outputView; + + public LadderGameController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void ladderGame() { + outputView.printParticipantInquiry(); + List participants = inputView.readParticipants(); + + outputView.printResultPrizeInquiry(); + List prizes = inputView.readPrizeResults(); + + if (participants.size() != prizes.size()) { + throw new IllegalArgumentException("The number of participants does not match the number of prizes."); + } + + outputView.printLadderHeightInquiry(); + int height = inputView.readLadderHeight(); + + Ladder ladder = new Ladder(height, participants.size()); + + outputView.printLadderResult(ladder); + + } +} From 02b6a8de17e36183ba1c19de42e3337ceeadef3f Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:23:00 +0900 Subject: [PATCH 05/59] =?UTF-8?q?=20line=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Line.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/domain/Line.java diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java new file mode 100644 index 00000000..b1274b0b --- /dev/null +++ b/src/main/java/domain/Line.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.List; + +public class Line { + private final List points; + + public Line(List points) { + this.points = points; + } + + public List getPoints() { + return points; + } +} From 7cf45550ce2d4afae9c2019466323790375a15eb Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:23:11 +0900 Subject: [PATCH 06/59] =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Person.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/domain/Person.java diff --git a/src/main/java/domain/Person.java b/src/main/java/domain/Person.java new file mode 100644 index 00000000..b5146ef2 --- /dev/null +++ b/src/main/java/domain/Person.java @@ -0,0 +1,9 @@ +package domain; + +public class Person { + private final String name; + + public Person(String name) { + this.name = name; + } +} From dcf7dc4e536c3a46aff71adacbbcecab65579cfc Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:23:29 +0900 Subject: [PATCH 07/59] =?UTF-8?q?=20main=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGame.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/LadderGame.java diff --git a/src/main/java/LadderGame.java b/src/main/java/LadderGame.java new file mode 100644 index 00000000..c93039bb --- /dev/null +++ b/src/main/java/LadderGame.java @@ -0,0 +1,13 @@ +import view.InputView; +import view.OutputView; + +public class LadderGame { + public static void main(String[] args) { + LadderGameController ladderGameController = new LadderGameController( + new InputView(), + new OutputView() + ); + + ladderGameController.ladderGame(); + } +} From 06cc958d160afbeb64194185878ec2ce5c69ee91 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:23:41 +0900 Subject: [PATCH 08/59] =?UTF-8?q?=20=EB=8B=B9=EC=B2=A8=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Prize.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/domain/Prize.java diff --git a/src/main/java/domain/Prize.java b/src/main/java/domain/Prize.java new file mode 100644 index 00000000..129da4f8 --- /dev/null +++ b/src/main/java/domain/Prize.java @@ -0,0 +1,9 @@ +package domain; + +public class Prize { + private final int cost; + + public Prize(int cost) { + this.cost = cost; + } +} From fc66931da6b2d9bf4c40effd04e6917fa71beea7 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:23:48 +0900 Subject: [PATCH 09/59] =?UTF-8?q?=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 57 ++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/domain/Ladder.java diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java new file mode 100644 index 00000000..0968004d --- /dev/null +++ b/src/main/java/domain/Ladder.java @@ -0,0 +1,57 @@ +package domain; + +import java.util.List; + +public class Ladder { + private final List lines; + private final RandomLadderGenerator randomLadderGenerator = new RandomLadderGenerator(); + + public Ladder(int lineHeight, int ladderWidth) { + List lines = randomLadderGenerator.generateLadder(lineHeight, ladderWidth); + checkLadderValidation(lineHeight, lines); + this.lines = lines; + } + + public List getLines() { + return lines; + } + + private void checkLadderValidation(int lineHeight, List lines) { + for (int i = 0; i < lineHeight; i++) { + checkRowValidation(i, lines); + } + } + + private void checkRowValidation(int columnIndex, List lines) { + List rowDirections = lines.stream() + .map(l -> l.getPoints().get(columnIndex)) + .toList(); + + int rowSize = rowDirections.size(); + int rightCount = 0; + + for (int i = 0; i < rowSize; i++) { + if (rowDirections.get(i) == Direction.RIGHT) { + checkRightValidation(i, rowSize, rowDirections); + rightCount++; + } + + if (rowDirections.get(i) == Direction.LEFT) { + checkLeftValidation(rightCount); + rightCount--; + } + } + } + + private void checkRightValidation(int columnIndex, int rowSize, List rowDirections) { + if (columnIndex == rowSize - 1 || rowDirections.get(columnIndex + 1) != Direction.LEFT) { + throw new RuntimeException("사다리가 잘못 만들어졌습니다."); + } + } + + private void checkLeftValidation(int rightCount) { + if (rightCount == 0) { + throw new RuntimeException("사다리가 잘못 만들어졌습니다."); + } + } +} From 2e22fee5f2cddd51f551f153bc7f3362147fd9c4 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:24:00 +0900 Subject: [PATCH 10/59] =?UTF-8?q?=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=20=EC=83=9D=EC=84=B1=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/RandomLadderGenerator.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/main/java/domain/RandomLadderGenerator.java diff --git a/src/main/java/domain/RandomLadderGenerator.java b/src/main/java/domain/RandomLadderGenerator.java new file mode 100644 index 00000000..d0f2ee07 --- /dev/null +++ b/src/main/java/domain/RandomLadderGenerator.java @@ -0,0 +1,132 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomLadderGenerator { + private final ThreadLocalRandom random = ThreadLocalRandom.current(); + private static final int RANDOM_BOUND = 10; + + public List generateLadder(int lineHeight, int ladderWidth) { + List> columnRowConnections = generateLadderConnection(lineHeight, ladderWidth); + + return IntStream.range(0, ladderWidth) + .mapToObj(i -> generateLineByConnections(i, lineHeight, ladderWidth, columnRowConnections)) + .toList(); + } + + + private List> generateLadderConnection(int lineHeight, int ladderWidth) { + List> rowColumnConnections = new ArrayList<>(); + + for (int i = 0; i < lineHeight; i++) { + List rowConnections = generateRowConnections(ladderWidth); + rowColumnConnections.add(rowConnections); + } + + int ladderConnectionWidth = ladderWidth - 1; + + + return rotate2DConnection(ladderConnectionWidth, rowColumnConnections); + } + + private List generateRowConnections(int ladderWidth) { + List rowConnections = new ArrayList<>(); + + int ladderConnectionCount = ladderWidth - 1; + for (int i = 0; i < ladderConnectionCount; i++) { + Connection isConnected = generateSpotToSpotConnection(i, rowConnections); + rowConnections.add(isConnected); + } + + return rowConnections; + } + + private Connection generateSpotToSpotConnection(int lineIndex, List rowSpotsConnection) { + if (lineIndex != 0 && rowSpotsConnection.get(lineIndex - 1) == Connection.CONNECTED) + return Connection.UNCONNECTED; + + int randomValue = random.nextInt(RANDOM_BOUND); + + if (randomValue < 5) + return Connection.CONNECTED; + + return Connection.UNCONNECTED; + } + + private Line generateLineByConnections(int lineIndex, int lineHeight, int ladderWidth, List> columnRowConnections) { + if (lineIndex == 0) { + List lineRightConnections = columnRowConnections.get(0); + return generateFirstLine(lineRightConnections); + } + + if (lineIndex == ladderWidth -1) { + List lineLeftConnections = columnRowConnections.get(lineIndex - 1); + return generateLastLine(lineLeftConnections); + } + + List lineLeftConnections = columnRowConnections.get(lineIndex - 1); + List lineRightConnections = columnRowConnections.get(lineIndex); + return generateMiddlesLine(lineHeight, lineLeftConnections, lineRightConnections); + } + + private Line generateFirstLine(List lineRightConnections) { + List lineDirections = lineRightConnections.stream().map(c -> { + if (c == Connection.CONNECTED) + return Direction.RIGHT; + + return Direction.DOWN; + }).toList(); + + return new Line(lineDirections); + } + + private Line generateLastLine(List lineLeftConnections) { + List lineDirections = lineLeftConnections.stream().map(c -> { + if (c == Connection.CONNECTED) + return Direction.LEFT; + + return Direction.DOWN; + }).toList(); + + return new Line(lineDirections); + } + + private Line generateMiddlesLine(int lineHeight, List lineLeftConnections, List lineRightConnections) { + List lineDirections = new ArrayList<>(); + + for (int j = 0; j < lineHeight; j++) { + + if (lineLeftConnections.get(j) == Connection.UNCONNECTED && lineRightConnections.get(j) == Connection.UNCONNECTED) { + lineDirections.add(Direction.DOWN); + continue; + } + + if (lineLeftConnections.get(j) == Connection.CONNECTED) { + lineDirections.add(Direction.LEFT); + continue; + } + + lineDirections.add(Direction.RIGHT); + } + return new Line(lineDirections); + } + + private List> rotate2DConnection(int rowSize, List> rowColumnConnections) { + List> columnRowConnections = new ArrayList<>(); + for (int j = 0; j < rowSize; j++) { + List columnConnections = getColumnConnections(j, rowColumnConnections); + columnRowConnections.add(columnConnections); + } + + return columnRowConnections; + } + + private List getColumnConnections(int columnIndex, List> ladderConnection) { + return ladderConnection.stream() + .map(l -> l.get(columnIndex)) + .toList(); + } +} From 613461c6380a3ea5e72e0bfe22b19ebf933d1b79 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 00:30:48 +0900 Subject: [PATCH 11/59] =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 2 +- ...andomLadderGenerator.java => RandomLadderGeneratorImpl.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/domain/{RandomLadderGenerator.java => RandomLadderGeneratorImpl.java} (99%) diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index 0968004d..b0a3068c 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -4,7 +4,7 @@ public class Ladder { private final List lines; - private final RandomLadderGenerator randomLadderGenerator = new RandomLadderGenerator(); + private final RandomLadderGeneratorImpl randomLadderGenerator = new RandomLadderGeneratorImpl(); public Ladder(int lineHeight, int ladderWidth) { List lines = randomLadderGenerator.generateLadder(lineHeight, ladderWidth); diff --git a/src/main/java/domain/RandomLadderGenerator.java b/src/main/java/domain/RandomLadderGeneratorImpl.java similarity index 99% rename from src/main/java/domain/RandomLadderGenerator.java rename to src/main/java/domain/RandomLadderGeneratorImpl.java index d0f2ee07..1c412030 100644 --- a/src/main/java/domain/RandomLadderGenerator.java +++ b/src/main/java/domain/RandomLadderGeneratorImpl.java @@ -5,7 +5,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; -public class RandomLadderGenerator { +public class RandomLadderGeneratorImpl { private final ThreadLocalRandom random = ThreadLocalRandom.current(); private static final int RANDOM_BOUND = 10; From ed047ab8908f7f9c753398dda9069ba1a6f09d60 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 01:25:05 +0900 Subject: [PATCH 12/59] =?UTF-8?q?=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=20=EC=83=9D=EC=84=B1=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EC=83=81=ED=99=94=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 8 +++++--- src/main/java/domain/RandomLadderGenerator.java | 7 +++++++ src/main/java/domain/RandomLadderGeneratorImpl.java | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 src/main/java/domain/RandomLadderGenerator.java diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index b0a3068c..5b0204ac 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -4,10 +4,12 @@ public class Ladder { private final List lines; - private final RandomLadderGeneratorImpl randomLadderGenerator = new RandomLadderGeneratorImpl(); + private final RandomLadderGenerator randomLadderGenerator; - public Ladder(int lineHeight, int ladderWidth) { - List lines = randomLadderGenerator.generateLadder(lineHeight, ladderWidth); + public Ladder(int lineHeight, int ladderWidth, RandomLadderGenerator randomLadderGenerator) { + this.randomLadderGenerator = randomLadderGenerator; + + List lines = this.randomLadderGenerator.generateLadder(lineHeight, ladderWidth); checkLadderValidation(lineHeight, lines); this.lines = lines; } diff --git a/src/main/java/domain/RandomLadderGenerator.java b/src/main/java/domain/RandomLadderGenerator.java new file mode 100644 index 00000000..bb691dae --- /dev/null +++ b/src/main/java/domain/RandomLadderGenerator.java @@ -0,0 +1,7 @@ +package domain; + +import java.util.List; + +public interface RandomLadderGenerator { + List generateLadder(int lineHeight, int ladderWidth); +} diff --git a/src/main/java/domain/RandomLadderGeneratorImpl.java b/src/main/java/domain/RandomLadderGeneratorImpl.java index 1c412030..b50e4b3f 100644 --- a/src/main/java/domain/RandomLadderGeneratorImpl.java +++ b/src/main/java/domain/RandomLadderGeneratorImpl.java @@ -5,7 +5,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; -public class RandomLadderGeneratorImpl { +public class RandomLadderGeneratorImpl implements RandomLadderGenerator { private final ThreadLocalRandom random = ThreadLocalRandom.current(); private static final int RANDOM_BOUND = 10; From 71d47c78a21bec826cdafd0cd7737642e6d2e4e0 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 02:19:48 +0900 Subject: [PATCH 13/59] =?UTF-8?q?=20nextInt=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=EA=B1=B0=20nextLine=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 1c0d1958..054968d7 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -34,6 +34,10 @@ public List readPrizeResults() { } public int readLadderHeight() { - return scanner.nextInt(); + return Integer.parseInt(scanner.nextLine()); + } + + public String readPersonName() { + return scanner.nextLine(); } } From dd7174dfff92cd74cc2a4db8f211242cdbf820d6 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 02:20:16 +0900 Subject: [PATCH 14/59] =?UTF-8?q?=20width,=20height=20ladder?= =?UTF-8?q?=EC=9D=98=20field=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index 5b0204ac..b2a3bdb0 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -4,13 +4,18 @@ public class Ladder { private final List lines; + private final int ladderWidth; + private final int lineHeight; private final RandomLadderGenerator randomLadderGenerator; + public Ladder(int lineHeight, int ladderWidth, RandomLadderGenerator randomLadderGenerator) { this.randomLadderGenerator = randomLadderGenerator; + this.ladderWidth = ladderWidth; + this.lineHeight = lineHeight; List lines = this.randomLadderGenerator.generateLadder(lineHeight, ladderWidth); - checkLadderValidation(lineHeight, lines); + checkLadderValidation(lines); this.lines = lines; } @@ -18,7 +23,15 @@ public List getLines() { return lines; } - private void checkLadderValidation(int lineHeight, List lines) { + public int getLadderWidth() { + return ladderWidth; + } + + public int getLineHeight() { + return lineHeight; + } + + private void checkLadderValidation(List lines) { for (int i = 0; i < lineHeight; i++) { checkRowValidation(i, lines); } From 5781a34bd7338e964126895b09080214138873de Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 02:20:47 +0900 Subject: [PATCH 15/59] =?UTF-8?q?=20value=20object=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Person.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/domain/Person.java b/src/main/java/domain/Person.java index b5146ef2..d2c1b958 100644 --- a/src/main/java/domain/Person.java +++ b/src/main/java/domain/Person.java @@ -1,9 +1,35 @@ package domain; +import java.util.Objects; + public class Person { private final String name; + private static final int MAX_LENGTH = 5; public Person(String name) { + nameValidation(name); this.name = name; } + + public String getName() { + return name; + } + + private void nameValidation(String name) { + if (name.length() > MAX_LENGTH || name.isEmpty()) + throw new IllegalArgumentException("사람 이름은 1글자 이상 5글자 이하여야 합니다."); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return Objects.equals(name, person.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } } From 9b5c7b5d2762ed4b60b2abe2ae2b0e76a211edc9 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 02:21:07 +0900 Subject: [PATCH 16/59] =?UTF-8?q?=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 43 +++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 34e199c2..ae394b4c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -5,6 +5,9 @@ import java.util.List; public class OutputView { + public void printEmptyLine() { + System.out.println(); + } public void printParticipantInquiry() { System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); @@ -18,15 +21,34 @@ public void printLadderHeightInquiry() { System.out.println("최대 사다리 높이는 몇 개인가요?"); } - public void printLadderResult(Ladder ladder) { + public void printResult(List participants, Ladder ladder, List prizes) { + System.out.println("사다리 결과"); + + printParticipantsResult(participants); + + printLadderResult(ladder); + + printPrizesResult(prizes); + } + + private void printParticipantsResult(List participants) { + for (Person participant : participants) { + String name = participant.getName(); + String blanks = " ".repeat(5 - name.length()); + System.out.print(blanks + name + " "); + } + System.out.println(); + } + + private void printLadderResult(Ladder ladder) { List lines = ladder.getLines(); - int ladderWidth = lines.size(); - int lineHeight = lines.get(0).getPoints().size(); + int ladderWidth = ladder.getLadderWidth(); + int lineHeight = ladder.getLineHeight(); for (int i = 0; i < lineHeight; i++) { + System.out.print(" "); for (int j = 0; j < ladderWidth; j++) { Direction direction = lines.get(j).getPoints().get(i); - if (direction == Direction.RIGHT) { System.out.print("|-----"); } else { @@ -36,4 +58,17 @@ public void printLadderResult(Ladder ladder) { System.out.println(); } } + + private void printPrizesResult(List prizes) { + for (Prize prize : prizes) { + String name = prize.costToString(); + String blanks = " ".repeat(5 - name.length()); + System.out.print(blanks + name + " "); + } + System.out.println(); + } + + public void printPersonPrizeResult() { + + } } From 125810f1df13bd1b967824929daf2a37b6958096 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 02:22:12 +0900 Subject: [PATCH 17/59] =?UTF-8?q?=20Prize=20vo=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Prize.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/domain/Prize.java b/src/main/java/domain/Prize.java index 129da4f8..f904d3ad 100644 --- a/src/main/java/domain/Prize.java +++ b/src/main/java/domain/Prize.java @@ -1,9 +1,32 @@ package domain; +import java.util.Objects; + public class Prize { private final int cost; public Prize(int cost) { this.cost = cost; } + + public String costToString() { + if (cost ==0) + return "꽝"; + + return String.valueOf(cost); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Prize prize = (Prize) o; + return cost == prize.cost; + } + + @Override + public int hashCode() { + return Objects.hashCode(cost); + } } From 92408bb4a9c8207b061e3066f01e3b7803fc653a Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 22:34:46 +0900 Subject: [PATCH 18/59] =?UTF-8?q?=20=EC=8B=A4=ED=96=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B8=B0=EB=8A=A5=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 2 -- src/main/java/view/OutputView.java | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 054968d7..d8fd9354 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -29,8 +29,6 @@ public List readPrizeResults() { return new Prize(Integer.parseInt(p)); }) .toList(); - - } public int readLadderHeight() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index ae394b4c..c158887b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,6 +3,7 @@ import domain.*; import java.util.List; +import java.util.Map; public class OutputView { public void printEmptyLine() { @@ -68,7 +69,19 @@ private void printPrizesResult(List prizes) { System.out.println(); } - public void printPersonPrizeResult() { + public void printParticipantPrizeInquiry() { + System.out.println("결과를 보고 싶은 사람은?"); + } + + public void printParticipantPrizeResult(Prize prize) { + System.out.println("실행 결과"); + System.out.println(prize.costToString() + "\n"); + } + public void printParticipantsPrizesResult(Map participantsPrizes, List participants) { + System.out.println("실행 결과"); + for (Person participant : participants) { + System.out.println(participant.getName() + " : " + participantsPrizes.get(participant).costToString()); + } } } From 431bd39a188a2eaa52916e9c563c25c680f83b2f Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 22:35:02 +0900 Subject: [PATCH 19/59] =?UTF-8?q?=20=EC=8B=A4=ED=96=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Statistic.java | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/domain/Statistic.java diff --git a/src/main/java/domain/Statistic.java b/src/main/java/domain/Statistic.java new file mode 100644 index 00000000..d891c3fa --- /dev/null +++ b/src/main/java/domain/Statistic.java @@ -0,0 +1,52 @@ +package domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Statistic { + private final Map participantsPrizes; + + public Statistic(Ladder ladder, List participants, List prizes) { + this.participantsPrizes = statisticResult(ladder, participants, prizes); + } + + public Map getParticipantPrize() { + return participantsPrizes; + } + + public Prize getParticipantPrize(Person person) { + return participantsPrizes.get(person); + } + + private Map statisticResult(Ladder ladder, List participants, List prizes) { + Map participantsPrizes = new HashMap<>(); + int height = ladder.getLineHeight(); + + for (int i = 0; i < participants.size(); i++) { + int finalParticipantColumnIndex = getFinalColumnLocation(height, ladder, i); + participantsPrizes.put(participants.get(i), prizes.get(finalParticipantColumnIndex)); + } + + return participantsPrizes; + } + + private int getFinalColumnLocation(int height, Ladder ladder, int columnIndex) { + for (int j = 0; j < height; j++) { + Direction direction = ladder.getLines().get(columnIndex).getPoints().get(j); + columnIndex = changeColumnIndexByDirection(direction, columnIndex); + } + + return columnIndex; + } + + private int changeColumnIndexByDirection(Direction direction, int columnIndex) { + if (direction == Direction.RIGHT) + return ++columnIndex; + + if (direction == Direction.LEFT) + return --columnIndex; + + return columnIndex; + } +} From 77f88a7c9ce847dd15c6024ccf546c0e339e1920 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 22:35:13 +0900 Subject: [PATCH 20/59] =?UTF-8?q?=20controller=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 66 ++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index d208ee67..d32d8c9f 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -1,6 +1,4 @@ -import domain.Ladder; -import domain.Person; -import domain.Prize; +import domain.*; import view.InputView; import view.OutputView; @@ -17,22 +15,74 @@ public LadderGameController(InputView inputView, OutputView outputView) { } public void ladderGame() { + List participants = readParticipants(); + List prizes = readPrizes(); + if (participants.size() != prizes.size()) { + throw new IllegalArgumentException("The number of participants does not match the number of prizes."); + } + + int height = readLadderHeight(); + + Ladder ladder = new Ladder(height, participants.size(), new RandomLadderGeneratorImpl()); +// Map participantPrizes = Statistic.statisticResult(ladder, participants, prizes); + + outputView.printResult(participants, ladder, prizes); + outputView.printEmptyLine(); + + Statistic statistic = new Statistic(ladder, participants, prizes); + + + while(true) { + String name = readParticipantName(); + + if (name.equals("all")) { + break; + } + + Person person = new Person(name); + checkParticipantValidation(participants, person); + outputView.printParticipantPrizeResult(statistic.getParticipantPrize(person)); + } + + + outputView.printParticipantsPrizesResult(statistic.getParticipantPrize(), participants); + } + + private List readParticipants() { outputView.printParticipantInquiry(); List participants = inputView.readParticipants(); + outputView.printEmptyLine(); + return participants; + } + + private List readPrizes() { outputView.printResultPrizeInquiry(); List prizes = inputView.readPrizeResults(); + outputView.printEmptyLine(); - if (participants.size() != prizes.size()) { - throw new IllegalArgumentException("The number of participants does not match the number of prizes."); - } + return prizes; + } + private int readLadderHeight() { outputView.printLadderHeightInquiry(); int height = inputView.readLadderHeight(); + outputView.printEmptyLine(); + + return height; + } - Ladder ladder = new Ladder(height, participants.size()); + private String readParticipantName() { + outputView.printParticipantPrizeInquiry(); + String name = inputView.readPersonName(); + outputView.printEmptyLine(); - outputView.printLadderResult(ladder); + return name; + } + private void checkParticipantValidation(List participants, Person person) { + if (!participants.contains(person)) { + throw new IllegalArgumentException("참여자가 아닙니다."); + } } } From 9d693f0059d24740e6da0f500ee909e57ec5ddf0 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 22:38:30 +0900 Subject: [PATCH 21/59] =?UTF-8?q?=20Ladder=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LadderTest.java | 39 ++++++++++++ src/test/java/MockRandomLadderGenerator.java | 64 ++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 src/test/java/LadderTest.java create mode 100644 src/test/java/MockRandomLadderGenerator.java diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java new file mode 100644 index 00000000..d1e7d72d --- /dev/null +++ b/src/test/java/LadderTest.java @@ -0,0 +1,39 @@ +import domain.Ladder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class LadderTest { + @Test + void 사다리는_라인이_겹치면_안_된다() { + int lineHeight = 4; + int ladderWidth = 4; + + Assertions.assertThrows(RuntimeException.class, () -> { + Ladder ladder = new Ladder( + lineHeight, + ladderWidth, + new MockRandomLadderGenerator.AbnormalLadderGenerator() + ); + }); + } + + @Test + void 정상적인_사다리_생성() { + int lineHeight = 4; + int ladderWidth = 4; + + + Assertions.assertDoesNotThrow(() -> { + Ladder ladder = new Ladder( + lineHeight, + ladderWidth, + new MockRandomLadderGenerator.NormalLadderGenerator() + ); + }); + } + +} diff --git a/src/test/java/MockRandomLadderGenerator.java b/src/test/java/MockRandomLadderGenerator.java new file mode 100644 index 00000000..2926d4db --- /dev/null +++ b/src/test/java/MockRandomLadderGenerator.java @@ -0,0 +1,64 @@ +import domain.Direction; +import domain.Line; +import domain.RandomLadderGenerator; + +import java.util.List; + +public class MockRandomLadderGenerator { + public static class AbnormalLadderGenerator implements RandomLadderGenerator { + @Override + public List generateLadder(int lineHeight, int ladderWidth) { + return List.of( + new Line( + List.of( + Direction.RIGHT, Direction.DOWN, Direction.RIGHT, Direction.DOWN + ) + ), + new Line( + List.of( + Direction.LEFT, Direction.RIGHT, Direction.RIGHT, Direction.DOWN + ) + ), + new Line( + List.of( + Direction.DOWN, Direction.LEFT, Direction.LEFT, Direction.RIGHT + ) + ), + new Line( + List.of( + Direction.DOWN, Direction.DOWN, Direction.LEFT, Direction.LEFT + ) + ) + ); + } + } + + public static class NormalLadderGenerator implements RandomLadderGenerator { + @Override + public List generateLadder(int lineHeight, int ladderWidth) { + return List.of( + new Line( + List.of( + Direction.RIGHT, Direction.DOWN, Direction.RIGHT, Direction.DOWN + ) + ), + new Line( + List.of( + Direction.LEFT, Direction.RIGHT, Direction.LEFT, Direction.DOWN + ) + ), + new Line( + List.of( + Direction.DOWN, Direction.LEFT, Direction.RIGHT, Direction.RIGHT + ) + ), + new Line( + List.of( + Direction.DOWN, Direction.DOWN, Direction.LEFT, Direction.LEFT + ) + ) + ); + } + } + +} From 91e4ceb5c181f906e77866552f9f43c357e8190b Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 31 Oct 2024 22:38:50 +0900 Subject: [PATCH 22/59] =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8915e946..e6739a23 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -- [ ] 연결 여부는 랜덤으로 결정한다. -- [ ] 사다리는 라인이 겹치지 않아야 한다. +- [x] 연결 여부는 랜덤으로 결정한다. +- [x] 사다리는 라인이 겹치지 않아야 한다. +- [ ] 사람의 이름은 1자 이상 5자 이하여야 한다. From b70c3a5c5606d5a3e8c10de66eefe6df7a49e87e Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:29:41 +0900 Subject: [PATCH 23/59] =?UTF-8?q?=20Indent=201=EB=A1=9C=20=EB=A7=88?= =?UTF-8?q?=EC=B6=94=EB=A0=A4=EA=B3=A0=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/view/OutputView.java | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c158887b..4905e59b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -23,7 +23,7 @@ public void printLadderHeightInquiry() { } public void printResult(List participants, Ladder ladder, List prizes) { - System.out.println("사다리 결과"); + System.out.println("사다리 결과\n"); printParticipantsResult(participants); @@ -48,18 +48,27 @@ private void printLadderResult(Ladder ladder) { for (int i = 0; i < lineHeight; i++) { System.out.print(" "); - for (int j = 0; j < ladderWidth; j++) { - Direction direction = lines.get(j).getPoints().get(i); - if (direction == Direction.RIGHT) { - System.out.print("|-----"); - } else { - System.out.print("| "); - } - } + printLadderRowResult(lines, ladderWidth, i); System.out.println(); } } + private void printLadderRowResult(List lines, int ladderWidth, int columnIndex) { + for (int j = 0; j < ladderWidth; j++) { + Direction direction = lines.get(j).getPoints().get(columnIndex); + printByDirection(direction); + } + } + + private void printByDirection(Direction direction) { + if (direction == Direction.RIGHT) { + System.out.print("|-----"); + return; + } + + System.out.print("| "); + } + private void printPrizesResult(List prizes) { for (Prize prize : prizes) { String name = prize.costToString(); From c76ef4a64e9f33688fa2e9d3a1e1fd82006a98de Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:29:51 +0900 Subject: [PATCH 24/59] =?UTF-8?q?=20tmp=20=EB=B3=80=EC=88=98=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Statistic.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/Statistic.java b/src/main/java/domain/Statistic.java index d891c3fa..bfd288a3 100644 --- a/src/main/java/domain/Statistic.java +++ b/src/main/java/domain/Statistic.java @@ -41,12 +41,14 @@ private int getFinalColumnLocation(int height, Ladder ladder, int columnIndex) { } private int changeColumnIndexByDirection(Direction direction, int columnIndex) { + int tmp = columnIndex; + if (direction == Direction.RIGHT) - return ++columnIndex; + return ++tmp; if (direction == Direction.LEFT) - return --columnIndex; + return --tmp; - return columnIndex; + return tmp; } } From a09be2f9649fad99dca19855ccaa919405835257 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:47:16 +0900 Subject: [PATCH 25/59] =?UTF-8?q?=20=ED=95=A8=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index d32d8c9f..697742b9 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -17,21 +17,17 @@ public LadderGameController(InputView inputView, OutputView outputView) { public void ladderGame() { List participants = readParticipants(); List prizes = readPrizes(); - if (participants.size() != prizes.size()) { - throw new IllegalArgumentException("The number of participants does not match the number of prizes."); - } + + checkPrizeCountValidation(participants.size(), prizes.size()); int height = readLadderHeight(); Ladder ladder = new Ladder(height, participants.size(), new RandomLadderGeneratorImpl()); -// Map participantPrizes = Statistic.statisticResult(ladder, participants, prizes); outputView.printResult(participants, ladder, prizes); - outputView.printEmptyLine(); Statistic statistic = new Statistic(ladder, participants, prizes); - while(true) { String name = readParticipantName(); @@ -80,6 +76,12 @@ private String readParticipantName() { return name; } + private void checkPrizeCountValidation(int participantCount, int prizeCount) { + if (participantCount != prizeCount) { + throw new IllegalArgumentException("The number of participants does not match the number of prizes."); + } + } + private void checkParticipantValidation(List participants, Person person) { if (!participants.contains(person)) { throw new IllegalArgumentException("참여자가 아닙니다."); From 9bacca28680cfd89e3e42a957e7ae95e3cb6183f Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:47:37 +0900 Subject: [PATCH 26/59] =?UTF-8?q?=20=EA=B0=9C=ED=96=89=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 4905e59b..4c6686c0 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -30,6 +30,8 @@ public void printResult(List participants, Ladder ladder, List pr printLadderResult(ladder); printPrizesResult(prizes); + + printEmptyLine(); } private void printParticipantsResult(List participants) { From d76764355003add76fd8a013b2bef0a0edb8feb6 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:47:58 +0900 Subject: [PATCH 27/59] =?UTF-8?q?=20Person,=20Statistic=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20test=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PersonTest.java | 20 +++++++++++ src/test/java/StatisticTest.java | 57 ++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/test/java/PersonTest.java create mode 100644 src/test/java/StatisticTest.java diff --git a/src/test/java/PersonTest.java b/src/test/java/PersonTest.java new file mode 100644 index 00000000..4d70282a --- /dev/null +++ b/src/test/java/PersonTest.java @@ -0,0 +1,20 @@ +import domain.Person; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class PersonTest { + @Test + public void 사람_이름은_1자_이상_5자_이하_여야_한다() { + String name1 = "Seung"; + String name2 = ""; + String name3 = "SeungJ"; + + Assertions.assertDoesNotThrow(() -> new Person(name1)); + Assertions.assertThrows(IllegalArgumentException.class, () -> new Person(name2)); + Assertions.assertThrows(IllegalArgumentException.class, () -> new Person(name3)); + } +} diff --git a/src/test/java/StatisticTest.java b/src/test/java/StatisticTest.java new file mode 100644 index 00000000..0e9aab68 --- /dev/null +++ b/src/test/java/StatisticTest.java @@ -0,0 +1,57 @@ +import domain.*; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class StatisticTest { + @ParameterizedTest + @MethodSource("matchCountWithRank") + public void 참여자는_사다리를_이동하여_상품과_매치된다(Ladder ladder, List participants, List prizes) { + Statistic statistic = new Statistic(ladder, participants, prizes); + Map statisticResult = statistic.getParticipantPrize(); + Person s1= participants.get(0); + Person s2= participants.get(1); + Person s3= participants.get(2); + Person s4= participants.get(3); + Prize p1 = prizes.get(0); + Prize p2 = prizes.get(1); + Prize p3 = prizes.get(2); + Prize p4 = prizes.get(3); + + assertThat(statisticResult.get(s1)).isEqualTo(p3); + assertThat(statisticResult.get(s2)).isEqualTo(p2); + assertThat(statisticResult.get(s3)).isEqualTo(p1); + assertThat(statisticResult.get(s4)).isEqualTo(p4); + } + + private static Stream matchCountWithRank() { + return Stream.of( + Arguments.of( + new Ladder(4, 4, new MockRandomLadderGenerator.NormalLadderGenerator()), + List.of( + new Person("s1"), + new Person("s2"), + new Person("s3"), + new Person("s4") + ), + List.of( + new Prize(0), + new Prize(1000), + new Prize(2000), + new Prize(3000) + ) + ) + ); + } +} From 6aef072483919344359bcdb94cbee19986fabd92 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 01:48:33 +0900 Subject: [PATCH 28/59] =?UTF-8?q?=20warning=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LadderTest.java | 4 ++-- src/test/java/StatisticTest.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java index d1e7d72d..99405f68 100644 --- a/src/test/java/LadderTest.java +++ b/src/test/java/LadderTest.java @@ -13,7 +13,7 @@ public class LadderTest { int ladderWidth = 4; Assertions.assertThrows(RuntimeException.class, () -> { - Ladder ladder = new Ladder( + new Ladder( lineHeight, ladderWidth, new MockRandomLadderGenerator.AbnormalLadderGenerator() @@ -28,7 +28,7 @@ public class LadderTest { Assertions.assertDoesNotThrow(() -> { - Ladder ladder = new Ladder( + new Ladder( lineHeight, ladderWidth, new MockRandomLadderGenerator.NormalLadderGenerator() diff --git a/src/test/java/StatisticTest.java b/src/test/java/StatisticTest.java index 0e9aab68..db91cd00 100644 --- a/src/test/java/StatisticTest.java +++ b/src/test/java/StatisticTest.java @@ -1,7 +1,6 @@ import domain.*; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; From 540220175ee3f4970d4d407e91024d5deeb7b76c Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 02:06:44 +0900 Subject: [PATCH 29/59] =?UTF-8?q?=20=ED=95=A8=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 27 +++++++++-------- .../domain/RandomLadderGeneratorImpl.java | 29 ++++++++++--------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index 697742b9..154a351b 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -28,18 +28,7 @@ public void ladderGame() { Statistic statistic = new Statistic(ladder, participants, prizes); - while(true) { - String name = readParticipantName(); - - if (name.equals("all")) { - break; - } - - Person person = new Person(name); - checkParticipantValidation(participants, person); - outputView.printParticipantPrizeResult(statistic.getParticipantPrize(person)); - } - + printSpecificParticipantResult(statistic, participants); outputView.printParticipantsPrizesResult(statistic.getParticipantPrize(), participants); } @@ -76,6 +65,20 @@ private String readParticipantName() { return name; } + private void printSpecificParticipantResult(Statistic statistic, List participants) { + while(true) { + String name = readParticipantName(); + + if (name.equals("all")) { + break; + } + + Person person = new Person(name); + checkParticipantValidation(participants, person); + outputView.printParticipantPrizeResult(statistic.getParticipantPrize(person)); + } + } + private void checkPrizeCountValidation(int participantCount, int prizeCount) { if (participantCount != prizeCount) { throw new IllegalArgumentException("The number of participants does not match the number of prizes."); diff --git a/src/main/java/domain/RandomLadderGeneratorImpl.java b/src/main/java/domain/RandomLadderGeneratorImpl.java index b50e4b3f..f5cee7d6 100644 --- a/src/main/java/domain/RandomLadderGeneratorImpl.java +++ b/src/main/java/domain/RandomLadderGeneratorImpl.java @@ -49,7 +49,6 @@ private Connection generateSpotToSpotConnection(int lineIndex, List return Connection.UNCONNECTED; int randomValue = random.nextInt(RANDOM_BOUND); - if (randomValue < 5) return Connection.CONNECTED; @@ -69,27 +68,30 @@ private Line generateLineByConnections(int lineIndex, int lineHeight, int ladder List lineLeftConnections = columnRowConnections.get(lineIndex - 1); List lineRightConnections = columnRowConnections.get(lineIndex); + return generateMiddlesLine(lineHeight, lineLeftConnections, lineRightConnections); } private Line generateFirstLine(List lineRightConnections) { - List lineDirections = lineRightConnections.stream().map(c -> { - if (c == Connection.CONNECTED) - return Direction.RIGHT; - - return Direction.DOWN; - }).toList(); + List lineDirections = lineRightConnections.stream() + .map(c -> { + if (c == Connection.CONNECTED) + return Direction.RIGHT; + return Direction.DOWN; + }) + .toList(); return new Line(lineDirections); } private Line generateLastLine(List lineLeftConnections) { - List lineDirections = lineLeftConnections.stream().map(c -> { - if (c == Connection.CONNECTED) - return Direction.LEFT; - - return Direction.DOWN; - }).toList(); + List lineDirections = lineLeftConnections.stream() + .map(c -> { + if (c == Connection.CONNECTED) + return Direction.LEFT; + return Direction.DOWN; + }) + .toList(); return new Line(lineDirections); } @@ -98,7 +100,6 @@ private Line generateMiddlesLine(int lineHeight, List lineLeftConnec List lineDirections = new ArrayList<>(); for (int j = 0; j < lineHeight; j++) { - if (lineLeftConnections.get(j) == Connection.UNCONNECTED && lineRightConnections.get(j) == Connection.UNCONNECTED) { lineDirections.add(Direction.DOWN); continue; From 726700e86dd34ab85060cd67ffdd3c9cb702f867 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 02:06:58 +0900 Subject: [PATCH 30/59] =?UTF-8?q?=20prize=20test=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PrizeTest.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/PrizeTest.java diff --git a/src/test/java/PrizeTest.java b/src/test/java/PrizeTest.java new file mode 100644 index 00000000..26958493 --- /dev/null +++ b/src/test/java/PrizeTest.java @@ -0,0 +1,22 @@ +import domain.Prize; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class PrizeTest { + @Test + public void vo_테스트() { + int cost1 = 1000; + int cost2 = 2000; + Prize prize1 = new Prize(cost1); + Prize prize2 = new Prize(cost1); + Prize prize3 = new Prize(cost2); + + assertThat(prize1.equals(prize2)).isTrue(); + assertThat(prize1.equals(prize3)).isFalse(); + } +} From a2f58846d6d8420dc5ccca2fbe498ba37a42cdbc Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 02:09:32 +0900 Subject: [PATCH 31/59] =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6739a23..6cbb9067 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ - [x] 연결 여부는 랜덤으로 결정한다. - [x] 사다리는 라인이 겹치지 않아야 한다. -- [ ] 사람의 이름은 1자 이상 5자 이하여야 한다. +- [x] 사람의 이름은 1자 이상 5자 이하여야 한다. From f567502fb7df87255847135565ca1563d7a23829 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 1 Nov 2024 02:10:25 +0900 Subject: [PATCH 32/59] =?UTF-8?q?=20warning=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LadderTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java index 99405f68..5dbbda56 100644 --- a/src/test/java/LadderTest.java +++ b/src/test/java/LadderTest.java @@ -12,13 +12,13 @@ public class LadderTest { int lineHeight = 4; int ladderWidth = 4; - Assertions.assertThrows(RuntimeException.class, () -> { + Assertions.assertThrows(RuntimeException.class, () -> new Ladder( lineHeight, ladderWidth, new MockRandomLadderGenerator.AbnormalLadderGenerator() - ); - }); + ) + ); } @Test From e278cc8d193f30a544de606ec71616f64fc28a38 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Tue, 12 Nov 2024 22:42:10 +0900 Subject: [PATCH 33/59] =?UTF-8?q?=201.=20Person=20=EA=B0=92=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=202.=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=8F=99=EC=82=AC=ED=98=95=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Person.java | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/main/java/domain/Person.java b/src/main/java/domain/Person.java index d2c1b958..0cb6fa82 100644 --- a/src/main/java/domain/Person.java +++ b/src/main/java/domain/Person.java @@ -1,35 +1,20 @@ package domain; -import java.util.Objects; - public class Person { - private final String name; private static final int MAX_LENGTH = 5; + private final String name; public Person(String name) { - nameValidation(name); + validateName(name); this.name = name; } - public String getName() { - return name; - } - - private void nameValidation(String name) { + private void validateName(String name) { if (name.length() > MAX_LENGTH || name.isEmpty()) throw new IllegalArgumentException("사람 이름은 1글자 이상 5글자 이하여야 합니다."); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Person person = (Person) o; - return Objects.equals(name, person.name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name); + public String getName() { + return name; } } From bf26804fa9eac5d06ce74b31cf1d6ccc49526dd2 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 14 Nov 2024 21:43:07 +0900 Subject: [PATCH 34/59] =?UTF-8?q?=20README=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6cbb9067..b1549ce1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ -- [x] 연결 여부는 랜덤으로 결정한다. -- [x] 사다리는 라인이 겹치지 않아야 한다. +# java-ladder + +자바 사다리 미션 저장소 + +## 개요 + +참여자와 상품을 입력 받아 랜덤 사다리를 만들어 참여자와 상품을 연결시켜주는 게임이다. + +## 요구사항 + +### 참여자 + - [x] 사람의 이름은 1자 이상 5자 이하여야 한다. +- [ ] 각 라인의 출발점에는 하나의 사람만 있을 수 있다. +- [ ] 참여자들은 정해진 라인을 따라 이동한다. + +### 상품 + +- [ ] 상품은 금액으로 이루어져 있다. + +### Line + +- [ ] 라인들의 각 지점은 오른쪽, 왼쪽, 아래쪽 방향성 중 하나만을 가질 수 있다. + +### 사다리 + +- [ ] 여러개의 Line이 모여 하나의 사다리를 만든다. +- [x] Line들의 연결 여부는 랜덤으로 결정한다. +- [x] 사다리는 라인이 겹치지 않아야 한다. From 915c745f842a8cb093c0b35de7d21414c96e7f69 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 14 Nov 2024 21:44:24 +0900 Subject: [PATCH 35/59] =?UTF-8?q?=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=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/.gitkeep | 0 src/main/java/domain/Ladder.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/main/java/.gitkeep diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index b2a3bdb0..b7298587 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -37,9 +37,9 @@ private void checkLadderValidation(List lines) { } } - private void checkRowValidation(int columnIndex, List lines) { + private void checkRowValidation(int rowIndex, List lines) { List rowDirections = lines.stream() - .map(l -> l.getPoints().get(columnIndex)) + .map(l -> l.getPoints().get(rowIndex)) .toList(); int rowSize = rowDirections.size(); From d5eda950c95e3b3fe3e82f13b8483d6e67303aa5 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Thu, 14 Nov 2024 21:47:44 +0900 Subject: [PATCH 36/59] =?UTF-8?q?=20=EA=B8=88=EC=95=A1=EC=9D=98?= =?UTF-8?q?=20=EA=BD=9D=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20outputview=EC=9D=98=20=EC=97=AD=ED=95=A0=EB=A1=9C?= =?UTF-8?q?=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/domain/Prize.java | 8 ++------ src/main/java/view/OutputView.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/Prize.java b/src/main/java/domain/Prize.java index f904d3ad..e78e6070 100644 --- a/src/main/java/domain/Prize.java +++ b/src/main/java/domain/Prize.java @@ -9,14 +9,10 @@ public Prize(int cost) { this.cost = cost; } - public String costToString() { - if (cost ==0) - return "꽝"; - - return String.valueOf(cost); + public int getCost() { + return cost; } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 4c6686c0..b7c17a7d 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -73,7 +73,7 @@ private void printByDirection(Direction direction) { private void printPrizesResult(List prizes) { for (Prize prize : prizes) { - String name = prize.costToString(); + String name = changePrizeToString(prize); String blanks = " ".repeat(5 - name.length()); System.out.print(blanks + name + " "); } @@ -86,13 +86,22 @@ public void printParticipantPrizeInquiry() { public void printParticipantPrizeResult(Prize prize) { System.out.println("실행 결과"); - System.out.println(prize.costToString() + "\n"); + System.out.println(changePrizeToString(prize) + "\n"); } public void printParticipantsPrizesResult(Map participantsPrizes, List participants) { System.out.println("실행 결과"); for (Person participant : participants) { - System.out.println(participant.getName() + " : " + participantsPrizes.get(participant).costToString()); + System.out.println(participant.getName() + " : " + changePrizeToString(participantsPrizes.get(participant))); } } + + private String changePrizeToString(Prize prize) { + int cost = prize.getCost(); + if (cost == 0) { + return "꽝"; + } + + return String.valueOf(cost); + } } From 6bf775414c46f61a1620726df3576956b3819676 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Fri, 15 Nov 2024 19:55:39 +0900 Subject: [PATCH 37/59] =?UTF-8?q?=20Ladder=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=EA=B3=BC=20entity=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 6 +++-- src/main/java/domain/Ladder.java | 26 +++++++------------ ...rGeneratorImpl.java => LadderFactory.java} | 19 +++++++++----- src/main/java/domain/Line.java | 4 +++ 4 files changed, 30 insertions(+), 25 deletions(-) rename src/main/java/domain/{RandomLadderGeneratorImpl.java => LadderFactory.java} (92%) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index 154a351b..23ef76bc 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -22,7 +22,9 @@ public void ladderGame() { int height = readLadderHeight(); - Ladder ladder = new Ladder(height, participants.size(), new RandomLadderGeneratorImpl()); + + LadderFactory ladderGenerator = new LadderFactory(height, participants.size()); //ladderFactory + Ladder ladder = ladderGenerator.newInstance(); outputView.printResult(participants, ladder, prizes); @@ -66,7 +68,7 @@ private String readParticipantName() { } private void printSpecificParticipantResult(Statistic statistic, List participants) { - while(true) { + while (true) { String name = readParticipantName(); if (name.equals("all")) { diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index b7298587..a14c7773 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -4,39 +4,31 @@ public class Ladder { private final List lines; - private final int ladderWidth; - private final int lineHeight; - private final RandomLadderGenerator randomLadderGenerator; - - public Ladder(int lineHeight, int ladderWidth, RandomLadderGenerator randomLadderGenerator) { - this.randomLadderGenerator = randomLadderGenerator; - this.ladderWidth = ladderWidth; - this.lineHeight = lineHeight; - - List lines = this.randomLadderGenerator.generateLadder(lineHeight, ladderWidth); + public Ladder(List lines) { checkLadderValidation(lines); this.lines = lines; + } public List getLines() { return lines; } - public int getLadderWidth() { - return ladderWidth; - } - - public int getLineHeight() { - return lineHeight; - } private void checkLadderValidation(List lines) { + // TODO:: 정리하기 + int lineHeight = lines.get(0).getPoints().size(); + for (int i = 0; i < lineHeight; i++) { checkRowValidation(i, lines); } } + private int getLadderHeight() { + return lines.size(); + } + private void checkRowValidation(int rowIndex, List lines) { List rowDirections = lines.stream() .map(l -> l.getPoints().get(rowIndex)) diff --git a/src/main/java/domain/RandomLadderGeneratorImpl.java b/src/main/java/domain/LadderFactory.java similarity index 92% rename from src/main/java/domain/RandomLadderGeneratorImpl.java rename to src/main/java/domain/LadderFactory.java index f5cee7d6..43d7e264 100644 --- a/src/main/java/domain/RandomLadderGeneratorImpl.java +++ b/src/main/java/domain/LadderFactory.java @@ -5,19 +5,26 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; -public class RandomLadderGeneratorImpl implements RandomLadderGenerator { +public class LadderFactory { private final ThreadLocalRandom random = ThreadLocalRandom.current(); private static final int RANDOM_BOUND = 10; - public List generateLadder(int lineHeight, int ladderWidth) { + private final int lineHeight; + private final int ladderWidth; + + public LadderFactory(int height, int width) { + this.lineHeight = height; + this.ladderWidth = width; + } + + public Ladder newInstance() { List> columnRowConnections = generateLadderConnection(lineHeight, ladderWidth); - return IntStream.range(0, ladderWidth) + return new Ladder(IntStream.range(0, ladderWidth) .mapToObj(i -> generateLineByConnections(i, lineHeight, ladderWidth, columnRowConnections)) - .toList(); + .toList()); } - private List> generateLadderConnection(int lineHeight, int ladderWidth) { List> rowColumnConnections = new ArrayList<>(); @@ -61,7 +68,7 @@ private Line generateLineByConnections(int lineIndex, int lineHeight, int ladder return generateFirstLine(lineRightConnections); } - if (lineIndex == ladderWidth -1) { + if (lineIndex == ladderWidth - 1) { List lineLeftConnections = columnRowConnections.get(lineIndex - 1); return generateLastLine(lineLeftConnections); } diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java index b1274b0b..cd8a6ca2 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/Line.java @@ -12,4 +12,8 @@ public Line(List points) { public List getPoints() { return points; } + + public int getLineHeight() { + return points.size(); + } } From 39d71d8b805a3316cb4d23dbadf84cda44b218c7 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Sat, 16 Nov 2024 13:41:16 +0900 Subject: [PATCH 38/59] =?UTF-8?q?=20Line=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/{Line.java => ColumnLine.java} | 4 +-- src/main/java/domain/Ladder.java | 25 +++++++++---------- src/main/java/domain/LadderFactory.java | 14 +++++------ src/main/java/view/OutputView.java | 8 +++--- 4 files changed, 25 insertions(+), 26 deletions(-) rename src/main/java/domain/{Line.java => ColumnLine.java} (78%) diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/ColumnLine.java similarity index 78% rename from src/main/java/domain/Line.java rename to src/main/java/domain/ColumnLine.java index cd8a6ca2..592e53a8 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/ColumnLine.java @@ -2,10 +2,10 @@ import java.util.List; -public class Line { +public class ColumnLine { private final List points; - public Line(List points) { + public ColumnLine(List points) { this.points = points; } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index a14c7773..fc1af0ea 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -3,34 +3,33 @@ import java.util.List; public class Ladder { - private final List lines; - - public Ladder(List lines) { - checkLadderValidation(lines); - this.lines = lines; + private final List columnLines; + public Ladder(List columnLines) { + checkLadderValidation(columnLines); + this.columnLines = columnLines; } - public List getLines() { - return lines; + public List getLines() { + return columnLines; } - private void checkLadderValidation(List lines) { + private void checkLadderValidation(List columnLines) { // TODO:: 정리하기 - int lineHeight = lines.get(0).getPoints().size(); + int lineHeight = columnLines.get(0).getPoints().size(); for (int i = 0; i < lineHeight; i++) { - checkRowValidation(i, lines); + checkRowValidation(i, columnLines); } } private int getLadderHeight() { - return lines.size(); + return columnLines.size(); } - private void checkRowValidation(int rowIndex, List lines) { - List rowDirections = lines.stream() + private void checkRowValidation(int rowIndex, List columnLines) { + List rowDirections = columnLines.stream() .map(l -> l.getPoints().get(rowIndex)) .toList(); diff --git a/src/main/java/domain/LadderFactory.java b/src/main/java/domain/LadderFactory.java index 43d7e264..4531df8a 100644 --- a/src/main/java/domain/LadderFactory.java +++ b/src/main/java/domain/LadderFactory.java @@ -62,7 +62,7 @@ private Connection generateSpotToSpotConnection(int lineIndex, List return Connection.UNCONNECTED; } - private Line generateLineByConnections(int lineIndex, int lineHeight, int ladderWidth, List> columnRowConnections) { + private ColumnLine generateLineByConnections(int lineIndex, int lineHeight, int ladderWidth, List> columnRowConnections) { if (lineIndex == 0) { List lineRightConnections = columnRowConnections.get(0); return generateFirstLine(lineRightConnections); @@ -79,7 +79,7 @@ private Line generateLineByConnections(int lineIndex, int lineHeight, int ladder return generateMiddlesLine(lineHeight, lineLeftConnections, lineRightConnections); } - private Line generateFirstLine(List lineRightConnections) { + private ColumnLine generateFirstLine(List lineRightConnections) { List lineDirections = lineRightConnections.stream() .map(c -> { if (c == Connection.CONNECTED) @@ -88,10 +88,10 @@ private Line generateFirstLine(List lineRightConnections) { }) .toList(); - return new Line(lineDirections); + return new ColumnLine(lineDirections); } - private Line generateLastLine(List lineLeftConnections) { + private ColumnLine generateLastLine(List lineLeftConnections) { List lineDirections = lineLeftConnections.stream() .map(c -> { if (c == Connection.CONNECTED) @@ -100,10 +100,10 @@ private Line generateLastLine(List lineLeftConnections) { }) .toList(); - return new Line(lineDirections); + return new ColumnLine(lineDirections); } - private Line generateMiddlesLine(int lineHeight, List lineLeftConnections, List lineRightConnections) { + private ColumnLine generateMiddlesLine(int lineHeight, List lineLeftConnections, List lineRightConnections) { List lineDirections = new ArrayList<>(); for (int j = 0; j < lineHeight; j++) { @@ -119,7 +119,7 @@ private Line generateMiddlesLine(int lineHeight, List lineLeftConnec lineDirections.add(Direction.RIGHT); } - return new Line(lineDirections); + return new ColumnLine(lineDirections); } private List> rotate2DConnection(int rowSize, List> rowColumnConnections) { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index b7c17a7d..b2b55823 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -44,20 +44,20 @@ private void printParticipantsResult(List participants) { } private void printLadderResult(Ladder ladder) { - List lines = ladder.getLines(); + List columnLines = ladder.getLines(); int ladderWidth = ladder.getLadderWidth(); int lineHeight = ladder.getLineHeight(); for (int i = 0; i < lineHeight; i++) { System.out.print(" "); - printLadderRowResult(lines, ladderWidth, i); + printLadderRowResult(columnLines, ladderWidth, i); System.out.println(); } } - private void printLadderRowResult(List lines, int ladderWidth, int columnIndex) { + private void printLadderRowResult(List columnLines, int ladderWidth, int columnIndex) { for (int j = 0; j < ladderWidth; j++) { - Direction direction = lines.get(j).getPoints().get(columnIndex); + Direction direction = columnLines.get(j).getPoints().get(columnIndex); printByDirection(direction); } } From 0c759b5932630832806d4fed8dbf45368ab29e05 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Sat, 16 Nov 2024 13:41:25 +0900 Subject: [PATCH 39/59] =?UTF-8?q?=20README=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b1549ce1..7a75c483 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ### 상품 -- [ ] 상품은 금액으로 이루어져 있다. +- [x] 상품은 금액으로 이루어져 있다. ### Line From d67a2e9f51f0682c2132ffd0b6ac677dde81a02d Mon Sep 17 00:00:00 2001 From: davidolleh Date: Sat, 16 Nov 2024 14:24:45 +0900 Subject: [PATCH 40/59] =?UTF-8?q?=20line=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?rowIndex=EC=9D=98=20=EB=B0=A9=ED=96=A5=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ColumnLine.java | 4 ++-- src/main/java/domain/Ladder.java | 17 +++++++---------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/domain/ColumnLine.java b/src/main/java/domain/ColumnLine.java index 592e53a8..2dd3a882 100644 --- a/src/main/java/domain/ColumnLine.java +++ b/src/main/java/domain/ColumnLine.java @@ -13,7 +13,7 @@ public List getPoints() { return points; } - public int getLineHeight() { - return points.size(); + public Direction getRowDirection(int row) { + return points.get(row); } } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index fc1af0ea..babaa9b3 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -20,19 +20,16 @@ private void checkLadderValidation(List columnLines) { int lineHeight = columnLines.get(0).getPoints().size(); for (int i = 0; i < lineHeight; i++) { - checkRowValidation(i, columnLines); - } - } + int columnIndex = i; + List rowDirections = columnLines.stream() + .map(l -> l.getRowDirection(columnIndex)) + .toList(); - private int getLadderHeight() { - return columnLines.size(); + checkRowValidation(rowDirections); + } } - private void checkRowValidation(int rowIndex, List columnLines) { - List rowDirections = columnLines.stream() - .map(l -> l.getPoints().get(rowIndex)) - .toList(); - + private void checkRowValidation(List rowDirections) { int rowSize = rowDirections.size(); int rightCount = 0; From 936a4717e0e5edd81b7f05f8c6b0c18acf73575c Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 15:29:44 +0900 Subject: [PATCH 41/59] =?UTF-8?q?=20Ladder=EC=9D=98=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20RowLine=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ColumnLine.java | 19 ----- src/main/java/domain/Direction.java | 8 +- src/main/java/domain/Ladder.java | 52 +----------- src/main/java/domain/LadderFactory.java | 106 +++++++++--------------- src/main/java/domain/RowLine.java | 45 ++++++++++ src/main/java/view/OutputView.java | 13 ++- 6 files changed, 100 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/domain/ColumnLine.java create mode 100644 src/main/java/domain/RowLine.java diff --git a/src/main/java/domain/ColumnLine.java b/src/main/java/domain/ColumnLine.java deleted file mode 100644 index 2dd3a882..00000000 --- a/src/main/java/domain/ColumnLine.java +++ /dev/null @@ -1,19 +0,0 @@ -package domain; - -import java.util.List; - -public class ColumnLine { - private final List points; - - public ColumnLine(List points) { - this.points = points; - } - - public List getPoints() { - return points; - } - - public Direction getRowDirection(int row) { - return points.get(row); - } -} diff --git a/src/main/java/domain/Direction.java b/src/main/java/domain/Direction.java index 9a015757..5402d3c5 100644 --- a/src/main/java/domain/Direction.java +++ b/src/main/java/domain/Direction.java @@ -1,5 +1,11 @@ package domain; public enum Direction { - LEFT, RIGHT, DOWN + LEFT(-1), RIGHT(1), DOWN(0); + + int offset; + + Direction(int offset) { + this.offset = offset; + } } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index babaa9b3..a87aeab4 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -3,58 +3,14 @@ import java.util.List; public class Ladder { - private final List columnLines; + private final List columnLines; - public Ladder(List columnLines) { - checkLadderValidation(columnLines); + + public Ladder(List columnLines) { this.columnLines = columnLines; } - public List getLines() { + public List getLines() { return columnLines; } - - - private void checkLadderValidation(List columnLines) { - // TODO:: 정리하기 - int lineHeight = columnLines.get(0).getPoints().size(); - - for (int i = 0; i < lineHeight; i++) { - int columnIndex = i; - List rowDirections = columnLines.stream() - .map(l -> l.getRowDirection(columnIndex)) - .toList(); - - checkRowValidation(rowDirections); - } - } - - private void checkRowValidation(List rowDirections) { - int rowSize = rowDirections.size(); - int rightCount = 0; - - for (int i = 0; i < rowSize; i++) { - if (rowDirections.get(i) == Direction.RIGHT) { - checkRightValidation(i, rowSize, rowDirections); - rightCount++; - } - - if (rowDirections.get(i) == Direction.LEFT) { - checkLeftValidation(rightCount); - rightCount--; - } - } - } - - private void checkRightValidation(int columnIndex, int rowSize, List rowDirections) { - if (columnIndex == rowSize - 1 || rowDirections.get(columnIndex + 1) != Direction.LEFT) { - throw new RuntimeException("사다리가 잘못 만들어졌습니다."); - } - } - - private void checkLeftValidation(int rightCount) { - if (rightCount == 0) { - throw new RuntimeException("사다리가 잘못 만들어졌습니다."); - } - } } diff --git a/src/main/java/domain/LadderFactory.java b/src/main/java/domain/LadderFactory.java index 4531df8a..39156bd7 100644 --- a/src/main/java/domain/LadderFactory.java +++ b/src/main/java/domain/LadderFactory.java @@ -20,9 +20,11 @@ public LadderFactory(int height, int width) { public Ladder newInstance() { List> columnRowConnections = generateLadderConnection(lineHeight, ladderWidth); - return new Ladder(IntStream.range(0, ladderWidth) - .mapToObj(i -> generateLineByConnections(i, lineHeight, ladderWidth, columnRowConnections)) - .toList()); + List rowLines = IntStream.range(0, lineHeight) + .mapToObj(i -> generateRowLineByConnections(columnRowConnections.get(i))) + .toList(); + + return new Ladder(rowLines); } private List> generateLadderConnection(int lineHeight, int ladderWidth) { @@ -33,10 +35,7 @@ private List> generateLadderConnection(int lineHeight, int ladd rowColumnConnections.add(rowConnections); } - int ladderConnectionWidth = ladderWidth - 1; - - - return rotate2DConnection(ladderConnectionWidth, rowColumnConnections); + return rowColumnConnections; } private List generateRowConnections(int ladderWidth) { @@ -62,79 +61,52 @@ private Connection generateSpotToSpotConnection(int lineIndex, List return Connection.UNCONNECTED; } - private ColumnLine generateLineByConnections(int lineIndex, int lineHeight, int ladderWidth, List> columnRowConnections) { - if (lineIndex == 0) { - List lineRightConnections = columnRowConnections.get(0); - return generateFirstLine(lineRightConnections); - } - - if (lineIndex == ladderWidth - 1) { - List lineLeftConnections = columnRowConnections.get(lineIndex - 1); - return generateLastLine(lineLeftConnections); - } - - List lineLeftConnections = columnRowConnections.get(lineIndex - 1); - List lineRightConnections = columnRowConnections.get(lineIndex); - - return generateMiddlesLine(lineHeight, lineLeftConnections, lineRightConnections); - } - - private ColumnLine generateFirstLine(List lineRightConnections) { - List lineDirections = lineRightConnections.stream() - .map(c -> { - if (c == Connection.CONNECTED) - return Direction.RIGHT; - return Direction.DOWN; - }) - .toList(); - - return new ColumnLine(lineDirections); - } + private RowLine generateRowLineByConnections(List rowConnections) { + List directions = new ArrayList<>(); - private ColumnLine generateLastLine(List lineLeftConnections) { - List lineDirections = lineLeftConnections.stream() - .map(c -> { - if (c == Connection.CONNECTED) - return Direction.LEFT; - return Direction.DOWN; - }) - .toList(); - - return new ColumnLine(lineDirections); - } - - private ColumnLine generateMiddlesLine(int lineHeight, List lineLeftConnections, List lineRightConnections) { - List lineDirections = new ArrayList<>(); - - for (int j = 0; j < lineHeight; j++) { - if (lineLeftConnections.get(j) == Connection.UNCONNECTED && lineRightConnections.get(j) == Connection.UNCONNECTED) { - lineDirections.add(Direction.DOWN); + for (int i = 0; i < ladderWidth; i++) { + if (i == 0) { + Direction direction = getFirstLineDirection(rowConnections.get(i)); + directions.add(direction); continue; } - if (lineLeftConnections.get(j) == Connection.CONNECTED) { - lineDirections.add(Direction.LEFT); + if (i == ladderWidth - 1) { + Direction direction = getLastLineDirection(rowConnections.get(i - 1)); + directions.add(direction); continue; } - lineDirections.add(Direction.RIGHT); + Direction direction = getMiddleLineDirection(rowConnections.get(i - 1), rowConnections.get(i)); + directions.add(direction); } - return new ColumnLine(lineDirections); + + return new RowLine(directions); } - private List> rotate2DConnection(int rowSize, List> rowColumnConnections) { - List> columnRowConnections = new ArrayList<>(); - for (int j = 0; j < rowSize; j++) { - List columnConnections = getColumnConnections(j, rowColumnConnections); - columnRowConnections.add(columnConnections); + private Direction getFirstLineDirection(Connection connection) { + if (connection == Connection.CONNECTED) { + return Direction.RIGHT; } + return Direction.DOWN; + } - return columnRowConnections; + private Direction getLastLineDirection(Connection connection) { + if (connection == Connection.CONNECTED) { + return Direction.LEFT; + } + return Direction.DOWN; } - private List getColumnConnections(int columnIndex, List> ladderConnection) { - return ladderConnection.stream() - .map(l -> l.get(columnIndex)) - .toList(); + private Direction getMiddleLineDirection(Connection currentConnection, Connection nextConnection) { + if (currentConnection == Connection.CONNECTED) { + return Direction.LEFT; + } + + if (nextConnection == Connection.CONNECTED) { + return Direction.RIGHT; + } + + return Direction.DOWN; } } diff --git a/src/main/java/domain/RowLine.java b/src/main/java/domain/RowLine.java new file mode 100644 index 00000000..08bb7862 --- /dev/null +++ b/src/main/java/domain/RowLine.java @@ -0,0 +1,45 @@ +package domain; + +import java.util.List; + +public class RowLine { + private final List points; + + public RowLine(List points) { + validateRowLine(points); + this.points = points; + } + + public List getPoints() { + return points; + } + + private void validateRowLine(List rowDirections) { + int rowSize = rowDirections.size(); + int rightCount = 0; + + for (int i = 0; i < rowSize; i++) { + if (rowDirections.get(i) == Direction.RIGHT) { + validateRight(i, rowSize, rowDirections); + rightCount++; + } + + if (rowDirections.get(i) == Direction.LEFT) { + validateLeft(rightCount); + rightCount--; + } + } + } + + private void validateRight(int columnIndex, int rowSize, List rowDirections) { + if (columnIndex == rowSize - 1 || rowDirections.get(columnIndex + 1) != Direction.LEFT) { + throw new RuntimeException("사다리가 잘못 만들어졌습니다."); + } + } + + private void validateLeft(int rightCount) { + if (rightCount == 0) { + throw new RuntimeException("사다리가 잘못 만들어졌습니다."); + } + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index b2b55823..e2cd8741 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -44,20 +44,17 @@ private void printParticipantsResult(List participants) { } private void printLadderResult(Ladder ladder) { - List columnLines = ladder.getLines(); - int ladderWidth = ladder.getLadderWidth(); - int lineHeight = ladder.getLineHeight(); + List rowLines = ladder.getLines(); - for (int i = 0; i < lineHeight; i++) { + for (RowLine rowLine : rowLines) { System.out.print(" "); - printLadderRowResult(columnLines, ladderWidth, i); + printLadderRowResult(rowLine); System.out.println(); } } - private void printLadderRowResult(List columnLines, int ladderWidth, int columnIndex) { - for (int j = 0; j < ladderWidth; j++) { - Direction direction = columnLines.get(j).getPoints().get(columnIndex); + private void printLadderRowResult(RowLine rowLine) { + for (Direction direction : rowLine.getPoints()) { printByDirection(direction); } } From 5aa5433bf5cda3861fe86535bbe17166012de885 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:11:02 +0900 Subject: [PATCH 42/59] =?UTF-8?q?=20main=20class=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=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/{LadderGame.java => LadderGameApplication.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/{LadderGame.java => LadderGameApplication.java} (89%) diff --git a/src/main/java/LadderGame.java b/src/main/java/LadderGameApplication.java similarity index 89% rename from src/main/java/LadderGame.java rename to src/main/java/LadderGameApplication.java index c93039bb..740ac211 100644 --- a/src/main/java/LadderGame.java +++ b/src/main/java/LadderGameApplication.java @@ -1,7 +1,7 @@ import view.InputView; import view.OutputView; -public class LadderGame { +public class LadderGameApplication { public static void main(String[] args) { LadderGameController ladderGameController = new LadderGameController( new InputView(), From 705728324b2ca5b9ebe1d975553708c82a8dda95 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:11:52 +0900 Subject: [PATCH 43/59] =?UTF-8?q?=20LadderGame=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameState.java | 7 +++ src/main/java/domain/LadderGame.java | 83 ++++++++++++++++++++++++++ src/main/java/domain/Participant.java | 42 +++++++++++++ src/main/java/domain/Participants.java | 59 ++++++++++++++++++ src/main/java/domain/RowLine.java | 12 ++-- 5 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 src/main/java/domain/GameState.java create mode 100644 src/main/java/domain/LadderGame.java create mode 100644 src/main/java/domain/Participant.java create mode 100644 src/main/java/domain/Participants.java diff --git a/src/main/java/domain/GameState.java b/src/main/java/domain/GameState.java new file mode 100644 index 00000000..360be067 --- /dev/null +++ b/src/main/java/domain/GameState.java @@ -0,0 +1,7 @@ +package domain; + +public enum GameState { + READY, + PROGRESS, + FINISH, +} diff --git a/src/main/java/domain/LadderGame.java b/src/main/java/domain/LadderGame.java new file mode 100644 index 00000000..0e23653e --- /dev/null +++ b/src/main/java/domain/LadderGame.java @@ -0,0 +1,83 @@ +package domain; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LadderGame { + private final Participants participants; + private final Ladder ladder; + private final List prizes; + private GameState gameState; + private Map> result; + + public LadderGame(Participants participants, Ladder ladder, List prizes) { + this.participants = participants; + this.ladder = ladder; + this.prizes = prizes; + this.gameState = GameState.READY; + } + + public void start() { + gameState = GameState.PROGRESS; + + Map> gameResult = new HashMap<>(); + + int participantsCount = participants.getParticipantsCount(); + + for (int i = 0; i < participantsCount; i++) { + Participant participant = participants.getParticipantByIndex(i); + Integer startPosition = participant.getPosition(); + List participantPositions = moveParticipant(participant); + gameResult.put(startPosition, participantPositions); + } + + result = gameResult; + + gameState = GameState.FINISH; + } + + private List moveParticipant(Participant participant) { + List participantPositions = new ArrayList<>(); + + for (RowLine rowLine : ladder.getLines()) { + Direction direction = rowLine.getPositionDirection(participant.getPosition()); + + participant.move(direction); + + participantPositions.add(participant.getPosition()); + } + + return participantPositions; + } + + public GameResult getParticipantsPrizes() { + if (gameState != GameState.FINISH) { + throw new RuntimeException("게임이 진행중입니다!"); + } + + Map participantsPrizes = new HashMap<>(); + + for (Integer startPosition : result.keySet()) { + List positions = result.get(startPosition); + Integer lastPosition = positions.get(positions.size() - 1); + + participantsPrizes.put(participants.getParticipantByIndex(startPosition), prizes.get(lastPosition)); + } + + return new GameResult(participantsPrizes); + } + + public Participants getParticipants() { + return participants; + } + + public Ladder getLadder() { + return ladder; + } + + public List getPrizes() { + return prizes; + } +} diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java new file mode 100644 index 00000000..25866d80 --- /dev/null +++ b/src/main/java/domain/Participant.java @@ -0,0 +1,42 @@ +package domain; + +import java.util.Objects; + +public class Participant { + private final Person person; + private int position; + + public Participant(Person person, int position) { + this.person = person; + this.position = position; + } + + public void move(Direction direction) { + position = position + direction.offset; + } + + public Person getPerson() { + return person; + } + + public String getParticipantName() { + return person.getName(); + } + + public int getPosition() { + return position; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Participant that = (Participant) o; + return Objects.equals(person.getName(), that.person.getName()); + } + + @Override + public int hashCode() { + return Objects.hashCode(person.getName()); + } +} diff --git a/src/main/java/domain/Participants.java b/src/main/java/domain/Participants.java new file mode 100644 index 00000000..19dd234b --- /dev/null +++ b/src/main/java/domain/Participants.java @@ -0,0 +1,59 @@ +package domain; + +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; + +public class Participants { + private final List participants; + + public Participants(List participants) { + validateParticipants(participants); + this.participants = participants; + } + + public static Participants fromPeople(List people) { + List participants = IntStream.range(0, people.size()) + .mapToObj(i -> new Participant(people.get(i), i)) + .toList(); + + return new Participants(participants); + } + + private void validateParticipants(List participants) { + int participantsCount = participants.size(); + + Set deduplicateParticipants = Set.copyOf(participants); + int deduplicateParticipantsCount = deduplicateParticipants.size(); + + if (participantsCount != deduplicateParticipantsCount) { + throw new IllegalArgumentException("중복된 이름의 참여자는 참여할 수 없습니다."); + } + } + + public int getParticipantsCount() { + return participants.size(); + } + + public Participant getParticipantByIndex(int index) { + return participants.get(index); + } + + public Participant getParticipantByName(Person person) { + return participants.stream() + .filter(participant -> participant.getParticipantName().equals(person.getName())) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } + + public List getParticipants() { + return participants; + } + + public boolean containsPerson(Person person) { + return participants.stream() + .map(Participant::getParticipantName) + .toList() + .contains(person.getName()); + } +} diff --git a/src/main/java/domain/RowLine.java b/src/main/java/domain/RowLine.java index 08bb7862..3ef292ce 100644 --- a/src/main/java/domain/RowLine.java +++ b/src/main/java/domain/RowLine.java @@ -10,10 +10,6 @@ public RowLine(List points) { this.points = points; } - public List getPoints() { - return points; - } - private void validateRowLine(List rowDirections) { int rowSize = rowDirections.size(); int rightCount = 0; @@ -42,4 +38,12 @@ private void validateLeft(int rightCount) { throw new RuntimeException("사다리가 잘못 만들어졌습니다."); } } + + public Direction getPositionDirection(int positionIndex) { + return points.get(positionIndex); + } + + public List getPoints() { + return points; + } } From d766f09008ba9d086605d1e02abb762ad10509dc Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:12:05 +0900 Subject: [PATCH 44/59] =?UTF-8?q?=20LadderGame=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameResult.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/domain/GameResult.java diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/GameResult.java new file mode 100644 index 00000000..82b5b9fe --- /dev/null +++ b/src/main/java/domain/GameResult.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.Map; + +public class GameResult { + private final Map gameResult; + + public GameResult(Map gameResult) { + this.gameResult = gameResult; + } + + public Prize getPrize(Participant participant) { + return gameResult.get(participant); + } +} From f3dd3055894f6ac68ad07a18b3d386059e135cd2 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:12:40 +0900 Subject: [PATCH 45/59] =?UTF-8?q?=20Controller,=20OutputView=20L?= =?UTF-8?q?adderGame=EC=97=90=20=EB=A7=9E=EC=B6=B0=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 35 ++++++++++++------------- src/main/java/domain/Ladder.java | 1 - src/main/java/view/OutputView.java | 19 +++++++------- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index 23ef76bc..f181e75c 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -15,24 +15,29 @@ public LadderGameController(InputView inputView, OutputView outputView) { } public void ladderGame() { - List participants = readParticipants(); + List people = readParticipants(); List prizes = readPrizes(); - checkPrizeCountValidation(participants.size(), prizes.size()); + valdiateInputsCount(people.size(), prizes.size()); int height = readLadderHeight(); + int width = people.size(); - - LadderFactory ladderGenerator = new LadderFactory(height, participants.size()); //ladderFactory + LadderFactory ladderGenerator = new LadderFactory(height, width); Ladder ladder = ladderGenerator.newInstance(); - outputView.printResult(participants, ladder, prizes); + Participants participants = Participants.fromPeople(people); + LadderGame ladderGame = new LadderGame(participants, ladder, prizes); + + outputView.printResult(ladderGame.getParticipants(), ladderGame.getLadder(), ladderGame.getPrizes()); + + ladderGame.start(); - Statistic statistic = new Statistic(ladder, participants, prizes); + GameResult gameResult = ladderGame.getParticipantsPrizes(); - printSpecificParticipantResult(statistic, participants); + printSpecificParticipantResult(ladderGame.getParticipants(), gameResult); - outputView.printParticipantsPrizesResult(statistic.getParticipantPrize(), participants); + outputView.printParticipantsPrizesResult(ladderGame.getParticipants(), gameResult); } private List readParticipants() { @@ -67,7 +72,7 @@ private String readParticipantName() { return name; } - private void printSpecificParticipantResult(Statistic statistic, List participants) { + private void printSpecificParticipantResult(Participants participants, GameResult gameResult) { while (true) { String name = readParticipantName(); @@ -76,20 +81,14 @@ private void printSpecificParticipantResult(Statistic statistic, List pa } Person person = new Person(name); - checkParticipantValidation(participants, person); - outputView.printParticipantPrizeResult(statistic.getParticipantPrize(person)); + Participant participant = participants.getParticipantByName(person); + outputView.printParticipantPrizeResult(gameResult.getPrize(participant)); } } - private void checkPrizeCountValidation(int participantCount, int prizeCount) { + private void valdiateInputsCount(int participantCount, int prizeCount) { if (participantCount != prizeCount) { throw new IllegalArgumentException("The number of participants does not match the number of prizes."); } } - - private void checkParticipantValidation(List participants, Person person) { - if (!participants.contains(person)) { - throw new IllegalArgumentException("참여자가 아닙니다."); - } - } } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index a87aeab4..e71d036a 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -5,7 +5,6 @@ public class Ladder { private final List columnLines; - public Ladder(List columnLines) { this.columnLines = columnLines; } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index e2cd8741..0e7a6e99 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,7 +3,6 @@ import domain.*; import java.util.List; -import java.util.Map; public class OutputView { public void printEmptyLine() { @@ -22,10 +21,10 @@ public void printLadderHeightInquiry() { System.out.println("최대 사다리 높이는 몇 개인가요?"); } - public void printResult(List participants, Ladder ladder, List prizes) { + public void printResult(Participants participants, Ladder ladder, List prizes) { System.out.println("사다리 결과\n"); - printParticipantsResult(participants); + printParticipantsResult(participants.getParticipants()); printLadderResult(ladder); @@ -34,9 +33,9 @@ public void printResult(List participants, Ladder ladder, List pr printEmptyLine(); } - private void printParticipantsResult(List participants) { - for (Person participant : participants) { - String name = participant.getName(); + private void printParticipantsResult(List participants) { + for (Participant participant : participants) { + String name = participant.getParticipantName(); String blanks = " ".repeat(5 - name.length()); System.out.print(blanks + name + " "); } @@ -86,10 +85,12 @@ public void printParticipantPrizeResult(Prize prize) { System.out.println(changePrizeToString(prize) + "\n"); } - public void printParticipantsPrizesResult(Map participantsPrizes, List participants) { + public void printParticipantsPrizesResult(Participants participants, GameResult gameResult) { System.out.println("실행 결과"); - for (Person participant : participants) { - System.out.println(participant.getName() + " : " + changePrizeToString(participantsPrizes.get(participant))); + for (Participant participant : participants.getParticipants()) { + String name = participant.getParticipantName(); + Prize prize = gameResult.getPrize(participant); + System.out.println(name + " : " + changePrizeToString(prize)); } } From 1d25eb15b674ce518bc8bb584f90d314df316dac Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:12:51 +0900 Subject: [PATCH 46/59] =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/RandomLadderGenerator.java | 7 --- src/main/java/domain/Statistic.java | 54 ------------------- 2 files changed, 61 deletions(-) delete mode 100644 src/main/java/domain/RandomLadderGenerator.java delete mode 100644 src/main/java/domain/Statistic.java diff --git a/src/main/java/domain/RandomLadderGenerator.java b/src/main/java/domain/RandomLadderGenerator.java deleted file mode 100644 index bb691dae..00000000 --- a/src/main/java/domain/RandomLadderGenerator.java +++ /dev/null @@ -1,7 +0,0 @@ -package domain; - -import java.util.List; - -public interface RandomLadderGenerator { - List generateLadder(int lineHeight, int ladderWidth); -} diff --git a/src/main/java/domain/Statistic.java b/src/main/java/domain/Statistic.java deleted file mode 100644 index bfd288a3..00000000 --- a/src/main/java/domain/Statistic.java +++ /dev/null @@ -1,54 +0,0 @@ -package domain; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Statistic { - private final Map participantsPrizes; - - public Statistic(Ladder ladder, List participants, List prizes) { - this.participantsPrizes = statisticResult(ladder, participants, prizes); - } - - public Map getParticipantPrize() { - return participantsPrizes; - } - - public Prize getParticipantPrize(Person person) { - return participantsPrizes.get(person); - } - - private Map statisticResult(Ladder ladder, List participants, List prizes) { - Map participantsPrizes = new HashMap<>(); - int height = ladder.getLineHeight(); - - for (int i = 0; i < participants.size(); i++) { - int finalParticipantColumnIndex = getFinalColumnLocation(height, ladder, i); - participantsPrizes.put(participants.get(i), prizes.get(finalParticipantColumnIndex)); - } - - return participantsPrizes; - } - - private int getFinalColumnLocation(int height, Ladder ladder, int columnIndex) { - for (int j = 0; j < height; j++) { - Direction direction = ladder.getLines().get(columnIndex).getPoints().get(j); - columnIndex = changeColumnIndexByDirection(direction, columnIndex); - } - - return columnIndex; - } - - private int changeColumnIndexByDirection(Direction direction, int columnIndex) { - int tmp = columnIndex; - - if (direction == Direction.RIGHT) - return ++tmp; - - if (direction == Direction.LEFT) - return --tmp; - - return tmp; - } -} From 8f5d0143650eb82170ceb77c294212547f294d34 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:13:56 +0900 Subject: [PATCH 47/59] =?UTF-8?q?=20person=20record=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Participant.java | 6 +++--- src/main/java/domain/Participants.java | 4 ++-- src/main/java/domain/Person.java | 10 ++-------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 25866d80..4594a326 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -20,7 +20,7 @@ public Person getPerson() { } public String getParticipantName() { - return person.getName(); + return person.name(); } public int getPosition() { @@ -32,11 +32,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Participant that = (Participant) o; - return Objects.equals(person.getName(), that.person.getName()); + return Objects.equals(person.name(), that.person.name()); } @Override public int hashCode() { - return Objects.hashCode(person.getName()); + return Objects.hashCode(person.name()); } } diff --git a/src/main/java/domain/Participants.java b/src/main/java/domain/Participants.java index 19dd234b..3e202bdb 100644 --- a/src/main/java/domain/Participants.java +++ b/src/main/java/domain/Participants.java @@ -41,7 +41,7 @@ public Participant getParticipantByIndex(int index) { public Participant getParticipantByName(Person person) { return participants.stream() - .filter(participant -> participant.getParticipantName().equals(person.getName())) + .filter(participant -> participant.getParticipantName().equals(person.name())) .findFirst() .orElseThrow(IllegalArgumentException::new); } @@ -54,6 +54,6 @@ public boolean containsPerson(Person person) { return participants.stream() .map(Participant::getParticipantName) .toList() - .contains(person.getName()); + .contains(person.name()); } } diff --git a/src/main/java/domain/Person.java b/src/main/java/domain/Person.java index 0cb6fa82..6e1fb01e 100644 --- a/src/main/java/domain/Person.java +++ b/src/main/java/domain/Person.java @@ -1,20 +1,14 @@ package domain; -public class Person { +public record Person(String name) { private static final int MAX_LENGTH = 5; - private final String name; - public Person(String name) { + public Person { validateName(name); - this.name = name; } private void validateName(String name) { if (name.length() > MAX_LENGTH || name.isEmpty()) throw new IllegalArgumentException("사람 이름은 1글자 이상 5글자 이하여야 합니다."); } - - public String getName() { - return name; - } } From 3268173d87cbae9ea591477346b26ef7e18b31eb Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:33:53 +0900 Subject: [PATCH 48/59] =?UTF-8?q?=20README=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7a75c483..1e1f2743 100644 --- a/README.md +++ b/README.md @@ -8,22 +8,35 @@ ## 요구사항 -### 참여자 +### 사람(Person) - [x] 사람의 이름은 1자 이상 5자 이하여야 한다. -- [ ] 각 라인의 출발점에는 하나의 사람만 있을 수 있다. -- [ ] 참여자들은 정해진 라인을 따라 이동한다. -### 상품 +### 참여자(Participant) + +- [x] 참여자들은 사다리에서 자신의 위치를 갖고 있다. +- [X] 참여자들은 정해진 라인을 따라 이동한다. + +### 참여자들(Participants) + +- [x] 참여자들의 이름은 중복이 될 수 없다. +- [x] 각 라인의 출발점에는 하나의 사람만 있을 수 있다. + +### 상품(Prize) - [x] 상품은 금액으로 이루어져 있다. +- [x] 상품의 금액이 값을 표현한다.(vo를 표현할 수 있는 말이 무엇이 있을까?) + +### 라인(RowLine) + +- [x] 라인들의 각 지점은 오른쪽, 왼쪽, 아래쪽 방향성 중 하나만을 가질 수 있다. +- [x] 라인이 연결성은 겹치지 않아야 한다. +- [x] 라인의 연결 여부는 랜덤으로 결정한다. -### Line +### 사다리(Ladder) -- [ ] 라인들의 각 지점은 오른쪽, 왼쪽, 아래쪽 방향성 중 하나만을 가질 수 있다. +- [x] 여러개의 Line이 모여 하나의 사다리를 만든다. -### 사다리 +### 사다리 게임(LadderGame) -- [ ] 여러개의 Line이 모여 하나의 사다리를 만든다. -- [x] Line들의 연결 여부는 랜덤으로 결정한다. -- [x] 사다리는 라인이 겹치지 않아야 한다. +- [x] 참여자들을 라인 따라 이동해 상품과 최종적으로 연결을 맺는다. From 19585d2bfc2e85e1474e23a308b730ae3672f7fa Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:34:11 +0900 Subject: [PATCH 49/59] =?UTF-8?q?=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=95=A8=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/LadderGame.java | 3 ++- src/main/java/domain/Participant.java | 4 ---- src/main/java/domain/Participants.java | 18 ++---------------- src/main/java/view/OutputView.java | 4 ++-- 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/main/java/domain/LadderGame.java b/src/main/java/domain/LadderGame.java index 0e23653e..d448df65 100644 --- a/src/main/java/domain/LadderGame.java +++ b/src/main/java/domain/LadderGame.java @@ -42,7 +42,8 @@ private List moveParticipant(Participant participant) { List participantPositions = new ArrayList<>(); for (RowLine rowLine : ladder.getLines()) { - Direction direction = rowLine.getPositionDirection(participant.getPosition()); + int currentPosition = participant.getPosition(); + Direction direction = rowLine.getPositionDirection(currentPosition); participant.move(direction); diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 4594a326..ef16e356 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -15,10 +15,6 @@ public void move(Direction direction) { position = position + direction.offset; } - public Person getPerson() { - return person; - } - public String getParticipantName() { return person.name(); } diff --git a/src/main/java/domain/Participants.java b/src/main/java/domain/Participants.java index 3e202bdb..7efe61c1 100644 --- a/src/main/java/domain/Participants.java +++ b/src/main/java/domain/Participants.java @@ -4,12 +4,9 @@ import java.util.Set; import java.util.stream.IntStream; -public class Participants { - private final List participants; - - public Participants(List participants) { +public record Participants(List participants) { + public Participants { validateParticipants(participants); - this.participants = participants; } public static Participants fromPeople(List people) { @@ -45,15 +42,4 @@ public Participant getParticipantByName(Person person) { .findFirst() .orElseThrow(IllegalArgumentException::new); } - - public List getParticipants() { - return participants; - } - - public boolean containsPerson(Person person) { - return participants.stream() - .map(Participant::getParticipantName) - .toList() - .contains(person.name()); - } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0e7a6e99..8239b2ca 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -24,7 +24,7 @@ public void printLadderHeightInquiry() { public void printResult(Participants participants, Ladder ladder, List prizes) { System.out.println("사다리 결과\n"); - printParticipantsResult(participants.getParticipants()); + printParticipantsResult(participants.participants()); printLadderResult(ladder); @@ -87,7 +87,7 @@ public void printParticipantPrizeResult(Prize prize) { public void printParticipantsPrizesResult(Participants participants, GameResult gameResult) { System.out.println("실행 결과"); - for (Participant participant : participants.getParticipants()) { + for (Participant participant : participants.participants()) { String name = participant.getParticipantName(); Prize prize = gameResult.getPrize(participant); System.out.println(name + " : " + changePrizeToString(prize)); From afe1ed800b206bd888c0cf57f194c6511d2324e9 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:35:38 +0900 Subject: [PATCH 50/59] =?UTF-8?q?=20=ED=95=84=EB=93=9C=20final?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Direction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/Direction.java b/src/main/java/domain/Direction.java index 5402d3c5..7f4f2be5 100644 --- a/src/main/java/domain/Direction.java +++ b/src/main/java/domain/Direction.java @@ -3,7 +3,7 @@ public enum Direction { LEFT(-1), RIGHT(1), DOWN(0); - int offset; + final int offset; Direction(int offset) { this.offset = offset; From a866afbbca3149f587be92ecc1b14675f43afab6 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:38:21 +0900 Subject: [PATCH 51/59] =?UTF-8?q?=20class=20record=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Prize.java | 18 +----------------- src/main/java/view/OutputView.java | 2 +- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/main/java/domain/Prize.java b/src/main/java/domain/Prize.java index e78e6070..d895ce9a 100644 --- a/src/main/java/domain/Prize.java +++ b/src/main/java/domain/Prize.java @@ -1,17 +1,6 @@ package domain; -import java.util.Objects; - -public class Prize { - private final int cost; - - public Prize(int cost) { - this.cost = cost; - } - - public int getCost() { - return cost; - } +public record Prize(int cost) { @Override public boolean equals(Object o) { @@ -20,9 +9,4 @@ public boolean equals(Object o) { Prize prize = (Prize) o; return cost == prize.cost; } - - @Override - public int hashCode() { - return Objects.hashCode(cost); - } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 8239b2ca..a84ef2e7 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -95,7 +95,7 @@ public void printParticipantsPrizesResult(Participants participants, GameResult } private String changePrizeToString(Prize prize) { - int cost = prize.getCost(); + int cost = prize.cost(); if (cost == 0) { return "꽝"; } From 0c974c9b2a0718be866f2284eb4b81a9797455e2 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:38:52 +0900 Subject: [PATCH 52/59] =?UTF-8?q?=20class=20record=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RowLine.java | 11 ++--------- src/main/java/view/OutputView.java | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/domain/RowLine.java b/src/main/java/domain/RowLine.java index 3ef292ce..5d681e3c 100644 --- a/src/main/java/domain/RowLine.java +++ b/src/main/java/domain/RowLine.java @@ -2,12 +2,9 @@ import java.util.List; -public class RowLine { - private final List points; - - public RowLine(List points) { +public record RowLine(List points) { + public RowLine { validateRowLine(points); - this.points = points; } private void validateRowLine(List rowDirections) { @@ -42,8 +39,4 @@ private void validateLeft(int rightCount) { public Direction getPositionDirection(int positionIndex) { return points.get(positionIndex); } - - public List getPoints() { - return points; - } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index a84ef2e7..20c75b97 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -53,7 +53,7 @@ private void printLadderResult(Ladder ladder) { } private void printLadderRowResult(RowLine rowLine) { - for (Direction direction : rowLine.getPoints()) { + for (Direction direction : rowLine.points()) { printByDirection(direction); } } From 8bda0a95cb4bbcac7c9b30c25476c5c9f396562e Mon Sep 17 00:00:00 2001 From: davidolleh Date: Mon, 18 Nov 2024 21:46:34 +0900 Subject: [PATCH 53/59] =?UTF-8?q?=20LadderFactory=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 2 +- src/main/java/domain/LadderFactory.java | 111 +---------------- src/main/java/domain/RandomLadderFactory.java | 113 ++++++++++++++++++ 3 files changed, 116 insertions(+), 110 deletions(-) create mode 100644 src/main/java/domain/RandomLadderFactory.java diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index f181e75c..15cc270a 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -23,7 +23,7 @@ public void ladderGame() { int height = readLadderHeight(); int width = people.size(); - LadderFactory ladderGenerator = new LadderFactory(height, width); + LadderFactory ladderGenerator = new RandomLadderFactory(height, width); Ladder ladder = ladderGenerator.newInstance(); Participants participants = Participants.fromPeople(people); diff --git a/src/main/java/domain/LadderFactory.java b/src/main/java/domain/LadderFactory.java index 39156bd7..a4957fc8 100644 --- a/src/main/java/domain/LadderFactory.java +++ b/src/main/java/domain/LadderFactory.java @@ -1,112 +1,5 @@ package domain; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.IntStream; - -public class LadderFactory { - private final ThreadLocalRandom random = ThreadLocalRandom.current(); - private static final int RANDOM_BOUND = 10; - - private final int lineHeight; - private final int ladderWidth; - - public LadderFactory(int height, int width) { - this.lineHeight = height; - this.ladderWidth = width; - } - - public Ladder newInstance() { - List> columnRowConnections = generateLadderConnection(lineHeight, ladderWidth); - - List rowLines = IntStream.range(0, lineHeight) - .mapToObj(i -> generateRowLineByConnections(columnRowConnections.get(i))) - .toList(); - - return new Ladder(rowLines); - } - - private List> generateLadderConnection(int lineHeight, int ladderWidth) { - List> rowColumnConnections = new ArrayList<>(); - - for (int i = 0; i < lineHeight; i++) { - List rowConnections = generateRowConnections(ladderWidth); - rowColumnConnections.add(rowConnections); - } - - return rowColumnConnections; - } - - private List generateRowConnections(int ladderWidth) { - List rowConnections = new ArrayList<>(); - - int ladderConnectionCount = ladderWidth - 1; - for (int i = 0; i < ladderConnectionCount; i++) { - Connection isConnected = generateSpotToSpotConnection(i, rowConnections); - rowConnections.add(isConnected); - } - - return rowConnections; - } - - private Connection generateSpotToSpotConnection(int lineIndex, List rowSpotsConnection) { - if (lineIndex != 0 && rowSpotsConnection.get(lineIndex - 1) == Connection.CONNECTED) - return Connection.UNCONNECTED; - - int randomValue = random.nextInt(RANDOM_BOUND); - if (randomValue < 5) - return Connection.CONNECTED; - - return Connection.UNCONNECTED; - } - - private RowLine generateRowLineByConnections(List rowConnections) { - List directions = new ArrayList<>(); - - for (int i = 0; i < ladderWidth; i++) { - if (i == 0) { - Direction direction = getFirstLineDirection(rowConnections.get(i)); - directions.add(direction); - continue; - } - - if (i == ladderWidth - 1) { - Direction direction = getLastLineDirection(rowConnections.get(i - 1)); - directions.add(direction); - continue; - } - - Direction direction = getMiddleLineDirection(rowConnections.get(i - 1), rowConnections.get(i)); - directions.add(direction); - } - - return new RowLine(directions); - } - - private Direction getFirstLineDirection(Connection connection) { - if (connection == Connection.CONNECTED) { - return Direction.RIGHT; - } - return Direction.DOWN; - } - - private Direction getLastLineDirection(Connection connection) { - if (connection == Connection.CONNECTED) { - return Direction.LEFT; - } - return Direction.DOWN; - } - - private Direction getMiddleLineDirection(Connection currentConnection, Connection nextConnection) { - if (currentConnection == Connection.CONNECTED) { - return Direction.LEFT; - } - - if (nextConnection == Connection.CONNECTED) { - return Direction.RIGHT; - } - - return Direction.DOWN; - } +public interface LadderFactory { + Ladder newInstance(); } diff --git a/src/main/java/domain/RandomLadderFactory.java b/src/main/java/domain/RandomLadderFactory.java new file mode 100644 index 00000000..b5ec3cfa --- /dev/null +++ b/src/main/java/domain/RandomLadderFactory.java @@ -0,0 +1,113 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public class RandomLadderFactory implements LadderFactory { + private final ThreadLocalRandom random = ThreadLocalRandom.current(); + private static final int RANDOM_BOUND = 10; + + private final int lineHeight; + private final int ladderWidth; + + public RandomLadderFactory(int height, int width) { + this.lineHeight = height; + this.ladderWidth = width; + } + + @Override + public Ladder newInstance() { + List> columnRowConnections = generateLadderConnection(lineHeight, ladderWidth); + + List rowLines = IntStream.range(0, lineHeight) + .mapToObj(i -> generateRowLineByConnections(columnRowConnections.get(i))) + .toList(); + + return new Ladder(rowLines); + } + + private List> generateLadderConnection(int lineHeight, int ladderWidth) { + List> rowColumnConnections = new ArrayList<>(); + + for (int i = 0; i < lineHeight; i++) { + List rowConnections = generateRowConnections(ladderWidth); + rowColumnConnections.add(rowConnections); + } + + return rowColumnConnections; + } + + private List generateRowConnections(int ladderWidth) { + List rowConnections = new ArrayList<>(); + + int ladderConnectionCount = ladderWidth - 1; + for (int i = 0; i < ladderConnectionCount; i++) { + Connection isConnected = generateSpotToSpotConnection(i, rowConnections); + rowConnections.add(isConnected); + } + + return rowConnections; + } + + private Connection generateSpotToSpotConnection(int lineIndex, List rowSpotsConnection) { + if (lineIndex != 0 && rowSpotsConnection.get(lineIndex - 1) == Connection.CONNECTED) + return Connection.UNCONNECTED; + + int randomValue = random.nextInt(RANDOM_BOUND); + if (randomValue < 5) + return Connection.CONNECTED; + + return Connection.UNCONNECTED; + } + + private RowLine generateRowLineByConnections(List rowConnections) { + List directions = new ArrayList<>(); + + for (int i = 0; i < ladderWidth; i++) { + Direction direction = generateDirection(i, rowConnections); + directions.add(direction); + } + + return new RowLine(directions); + } + + private Direction generateDirection(int columnIndex, List rowConnections) { + if (columnIndex == 0) { + return getFirstLineDirection(rowConnections.get(columnIndex)); + } + + if (columnIndex == ladderWidth - 1) { + return getLastLineDirection(rowConnections.get(columnIndex - 1)); + } + + return getMiddleLineDirection(rowConnections.get(columnIndex - 1), rowConnections.get(columnIndex)); + } + + private Direction getFirstLineDirection(Connection connection) { + if (connection == Connection.CONNECTED) { + return Direction.RIGHT; + } + return Direction.DOWN; + } + + private Direction getLastLineDirection(Connection connection) { + if (connection == Connection.CONNECTED) { + return Direction.LEFT; + } + return Direction.DOWN; + } + + private Direction getMiddleLineDirection(Connection currentConnection, Connection nextConnection) { + if (currentConnection == Connection.CONNECTED) { + return Direction.LEFT; + } + + if (nextConnection == Connection.CONNECTED) { + return Direction.RIGHT; + } + + return Direction.DOWN; + } +} From 4547ffef0b92736a78ca1e1478f9d7f40c789795 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 16:18:21 +0900 Subject: [PATCH 54/59] =?UTF-8?q?=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LadderGameController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/LadderGameController.java b/src/main/java/LadderGameController.java index 15cc270a..d1c7281a 100644 --- a/src/main/java/LadderGameController.java +++ b/src/main/java/LadderGameController.java @@ -18,7 +18,7 @@ public void ladderGame() { List people = readParticipants(); List prizes = readPrizes(); - valdiateInputsCount(people.size(), prizes.size()); + validateInputsCount(people.size(), prizes.size()); int height = readLadderHeight(); int width = people.size(); @@ -86,7 +86,7 @@ private void printSpecificParticipantResult(Participants participants, GameResul } } - private void valdiateInputsCount(int participantCount, int prizeCount) { + private void validateInputsCount(int participantCount, int prizeCount) { if (participantCount != prizeCount) { throw new IllegalArgumentException("The number of participants does not match the number of prizes."); } From 7481d5d1ebd274cda173986baaf1218fb8ed9a5f Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 22:07:15 +0900 Subject: [PATCH 55/59] =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=EC=9E=90?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/ParticipantTest.java | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/test/java/ParticipantTest.java diff --git a/src/test/java/ParticipantTest.java b/src/test/java/ParticipantTest.java new file mode 100644 index 00000000..abb1295a --- /dev/null +++ b/src/test/java/ParticipantTest.java @@ -0,0 +1,40 @@ +import domain.Direction; +import domain.Participant; +import domain.Participants; +import domain.Person; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class ParticipantTest { + @Test + public void 중복된_이름을_가진_참여자는_존재할_수_없다() { + String name = "SJ"; + Person person1 = new Person(name); + Person person2 = new Person(name); + Person person3 = new Person("그리디"); + + List people = List.of(person1, person2, person3); + + Assertions.assertThrows(IllegalArgumentException.class, () -> Participants.fromPeople(people)); + } + + @Test + public void 참여자는_정해진_라인을따라_이동한다() { + Person person = new Person("그리디"); + + Participant participant = new Participant(person, 0); + + participant.move(Direction.RIGHT); + participant.move(Direction.RIGHT); + + assertThat(participant.getPosition()).isEqualTo(2); + } +} From a08a3c939be7afd7bf6004145a60b32d742b3394 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 22:07:33 +0900 Subject: [PATCH 56/59] =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/MockRandomLadderGenerator.java | 64 -------------------- src/test/java/StatisticTest.java | 56 ----------------- 2 files changed, 120 deletions(-) delete mode 100644 src/test/java/MockRandomLadderGenerator.java delete mode 100644 src/test/java/StatisticTest.java diff --git a/src/test/java/MockRandomLadderGenerator.java b/src/test/java/MockRandomLadderGenerator.java deleted file mode 100644 index 2926d4db..00000000 --- a/src/test/java/MockRandomLadderGenerator.java +++ /dev/null @@ -1,64 +0,0 @@ -import domain.Direction; -import domain.Line; -import domain.RandomLadderGenerator; - -import java.util.List; - -public class MockRandomLadderGenerator { - public static class AbnormalLadderGenerator implements RandomLadderGenerator { - @Override - public List generateLadder(int lineHeight, int ladderWidth) { - return List.of( - new Line( - List.of( - Direction.RIGHT, Direction.DOWN, Direction.RIGHT, Direction.DOWN - ) - ), - new Line( - List.of( - Direction.LEFT, Direction.RIGHT, Direction.RIGHT, Direction.DOWN - ) - ), - new Line( - List.of( - Direction.DOWN, Direction.LEFT, Direction.LEFT, Direction.RIGHT - ) - ), - new Line( - List.of( - Direction.DOWN, Direction.DOWN, Direction.LEFT, Direction.LEFT - ) - ) - ); - } - } - - public static class NormalLadderGenerator implements RandomLadderGenerator { - @Override - public List generateLadder(int lineHeight, int ladderWidth) { - return List.of( - new Line( - List.of( - Direction.RIGHT, Direction.DOWN, Direction.RIGHT, Direction.DOWN - ) - ), - new Line( - List.of( - Direction.LEFT, Direction.RIGHT, Direction.LEFT, Direction.DOWN - ) - ), - new Line( - List.of( - Direction.DOWN, Direction.LEFT, Direction.RIGHT, Direction.RIGHT - ) - ), - new Line( - List.of( - Direction.DOWN, Direction.DOWN, Direction.LEFT, Direction.LEFT - ) - ) - ); - } - } - -} diff --git a/src/test/java/StatisticTest.java b/src/test/java/StatisticTest.java deleted file mode 100644 index db91cd00..00000000 --- a/src/test/java/StatisticTest.java +++ /dev/null @@ -1,56 +0,0 @@ -import domain.*; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@SuppressWarnings("NonAsciiCharacters") -public class StatisticTest { - @ParameterizedTest - @MethodSource("matchCountWithRank") - public void 참여자는_사다리를_이동하여_상품과_매치된다(Ladder ladder, List participants, List prizes) { - Statistic statistic = new Statistic(ladder, participants, prizes); - Map statisticResult = statistic.getParticipantPrize(); - Person s1= participants.get(0); - Person s2= participants.get(1); - Person s3= participants.get(2); - Person s4= participants.get(3); - Prize p1 = prizes.get(0); - Prize p2 = prizes.get(1); - Prize p3 = prizes.get(2); - Prize p4 = prizes.get(3); - - assertThat(statisticResult.get(s1)).isEqualTo(p3); - assertThat(statisticResult.get(s2)).isEqualTo(p2); - assertThat(statisticResult.get(s3)).isEqualTo(p1); - assertThat(statisticResult.get(s4)).isEqualTo(p4); - } - - private static Stream matchCountWithRank() { - return Stream.of( - Arguments.of( - new Ladder(4, 4, new MockRandomLadderGenerator.NormalLadderGenerator()), - List.of( - new Person("s1"), - new Person("s2"), - new Person("s3"), - new Person("s4") - ), - List.of( - new Prize(0), - new Prize(1000), - new Prize(2000), - new Prize(3000) - ) - ) - ); - } -} From 27da6f5d3a6f1d0664d9690553ca4361dc01c54d Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 22:32:09 +0900 Subject: [PATCH 57/59] =?UTF-8?q?=20README=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1e1f2743..4acc9046 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,4 @@ ### 사다리 게임(LadderGame) - [x] 참여자들을 라인 따라 이동해 상품과 최종적으로 연결을 맺는다. +- [x] 게임이 완료되어야 최종 게임 결과를 확인할 수 있다. From 7e3f2e89820f25ae87386b2789bac3b923963cae Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 22:32:18 +0900 Subject: [PATCH 58/59] =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LadderGameTest.java | 61 ++++++++++++++++++++++ src/test/java/LadderTest.java | 39 -------------- src/test/java/MockRandomLadderFactory.java | 48 +++++++++++++++++ src/test/java/RowLineTest.java | 21 ++++++++ 4 files changed, 130 insertions(+), 39 deletions(-) create mode 100644 src/test/java/LadderGameTest.java delete mode 100644 src/test/java/LadderTest.java create mode 100644 src/test/java/MockRandomLadderFactory.java create mode 100644 src/test/java/RowLineTest.java diff --git a/src/test/java/LadderGameTest.java b/src/test/java/LadderGameTest.java new file mode 100644 index 00000000..d7e16b7c --- /dev/null +++ b/src/test/java/LadderGameTest.java @@ -0,0 +1,61 @@ +import domain.*; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class LadderGameTest { + @ParameterizedTest + @MethodSource("methodSourceTestArguments") + public void 참여자들은_라인_따라_이동해_상품과_최종적으로_연결을_맺는다(Participants participants, Ladder ladder, List prizes) { + LadderGame game = new LadderGame(participants, ladder, prizes); + game.start(); + + GameResult gameResult = game.getParticipantsPrizes(); + + assertThat(gameResult.getPrize(participants.getParticipantByIndex(0))).isEqualTo(prizes.get(0)); + assertThat(gameResult.getPrize(participants.getParticipantByIndex(1))).isEqualTo(prizes.get(3)); + assertThat(gameResult.getPrize(participants.getParticipantByIndex(2))).isEqualTo(prizes.get(2)); + assertThat(gameResult.getPrize(participants.getParticipantByIndex(3))).isEqualTo(prizes.get(1)); + } + + @ParameterizedTest + @MethodSource("methodSourceTestArguments") + public void 게임이_완료되어야_최종_결과_학인_가능하다(Participants participants, Ladder ladder, List prizes) { + LadderGame game = new LadderGame(participants, ladder, prizes); + + Assertions.assertThrows(RuntimeException.class, game::getParticipantsPrizes); + } + + private static Stream methodSourceTestArguments() { + Person person1 = new Person("프론트"); + Person person2 = new Person("백엔드"); + Person person3 = new Person("데브옵스"); + Person person4 = new Person("그리디"); + + List people = List.of(person1, person2, person3, person4); + + LadderFactory ladderFactory = new MockRandomLadderFactory.NormalLadderFactory(); + Ladder ladder = ladderFactory.newInstance(); + + List prizes = List.of( + new Prize(0), + new Prize(1000), + new Prize(2000), + new Prize(3000) + ); + + return Stream.of( + Arguments.of(Participants.fromPeople(people), ladder, prizes) + ); + } +} diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java deleted file mode 100644 index 5dbbda56..00000000 --- a/src/test/java/LadderTest.java +++ /dev/null @@ -1,39 +0,0 @@ -import domain.Ladder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; - -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@SuppressWarnings("NonAsciiCharacters") -public class LadderTest { - @Test - void 사다리는_라인이_겹치면_안_된다() { - int lineHeight = 4; - int ladderWidth = 4; - - Assertions.assertThrows(RuntimeException.class, () -> - new Ladder( - lineHeight, - ladderWidth, - new MockRandomLadderGenerator.AbnormalLadderGenerator() - ) - ); - } - - @Test - void 정상적인_사다리_생성() { - int lineHeight = 4; - int ladderWidth = 4; - - - Assertions.assertDoesNotThrow(() -> { - new Ladder( - lineHeight, - ladderWidth, - new MockRandomLadderGenerator.NormalLadderGenerator() - ); - }); - } - -} diff --git a/src/test/java/MockRandomLadderFactory.java b/src/test/java/MockRandomLadderFactory.java new file mode 100644 index 00000000..5d6c47ab --- /dev/null +++ b/src/test/java/MockRandomLadderFactory.java @@ -0,0 +1,48 @@ +import domain.Direction; +import domain.Ladder; +import domain.LadderFactory; +import domain.RowLine; + +import java.util.List; + +public class MockRandomLadderFactory { + public static class NormalLadderFactory implements LadderFactory { + @Override + public Ladder newInstance() { + List directions1 = List.of(Direction.RIGHT, Direction.LEFT, Direction.RIGHT, Direction.LEFT); + List directions2 = List.of(Direction.RIGHT, Direction.LEFT, Direction.DOWN, Direction.DOWN); + List directions3 = List.of(Direction.DOWN, Direction.RIGHT, Direction.LEFT, Direction.DOWN); + List directions4 = List.of(Direction.DOWN, Direction.DOWN, Direction.RIGHT, Direction.LEFT); + + List rowLines = List.of( + new RowLine(directions1), + new RowLine(directions2), + new RowLine(directions3), + new RowLine(directions4) + ); + + return new Ladder(rowLines); + } + } + + public static class AbnormalLadderFactory implements LadderFactory { + @Override + public Ladder newInstance() { + List directions1 = List.of(Direction.RIGHT, Direction.LEFT, Direction.RIGHT, Direction.LEFT); + List directions2 = List.of(Direction.RIGHT, Direction.LEFT, Direction.DOWN, Direction.DOWN); + List directions3 = List.of(Direction.DOWN, Direction.RIGHT, Direction.RIGHT, Direction.LEFT); + List directions4 = List.of(Direction.DOWN, Direction.DOWN, Direction.RIGHT, Direction.LEFT); + + + List rowLines = List.of( + new RowLine(directions1), + new RowLine(directions2), + new RowLine(directions3), + new RowLine(directions4) + + ); + + return new Ladder(rowLines); + } + } +} diff --git a/src/test/java/RowLineTest.java b/src/test/java/RowLineTest.java new file mode 100644 index 00000000..01fa269e --- /dev/null +++ b/src/test/java/RowLineTest.java @@ -0,0 +1,21 @@ +import domain.Direction; +import domain.RowLine; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +public class RowLineTest { + @Test + public void 라인의_연결성은_겹치면_안된다() { + List directions1 = List.of(Direction.DOWN, Direction.RIGHT, Direction.RIGHT, Direction.LEFT); + List directions2 = List.of(Direction.RIGHT, Direction.LEFT, Direction.DOWN, Direction.DOWN); + + Assertions.assertThrows(RuntimeException.class, () -> new RowLine(directions1)); + Assertions.assertDoesNotThrow(() -> new RowLine(directions2)); + } +} From 81e327f83c157faddb161e280a569ff163e6feb7 Mon Sep 17 00:00:00 2001 From: davidolleh Date: Wed, 20 Nov 2024 23:17:10 +0900 Subject: [PATCH 59/59] =?UTF-8?q?=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=9F=AC=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RandomLadderFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/RandomLadderFactory.java b/src/main/java/domain/RandomLadderFactory.java index b5ec3cfa..b2b31b46 100644 --- a/src/main/java/domain/RandomLadderFactory.java +++ b/src/main/java/domain/RandomLadderFactory.java @@ -6,7 +6,7 @@ import java.util.stream.IntStream; public class RandomLadderFactory implements LadderFactory { - private final ThreadLocalRandom random = ThreadLocalRandom.current(); + private static final ThreadLocalRandom random = ThreadLocalRandom.current(); private static final int RANDOM_BOUND = 10; private final int lineHeight;