From c06f475f1f74f85cc9c194d1f720f4239d2432a0 Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 11:03:36 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=201=EB=8B=A8=EA=B3=84=20PR=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20-=20Conditional=20->?= =?UTF-8?q?=20Predicate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/Conditional.java | 6 ------ src/main/java/nextstep/fp/Lambda.java | 3 ++- 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/nextstep/fp/Conditional.java diff --git a/src/main/java/nextstep/fp/Conditional.java b/src/main/java/nextstep/fp/Conditional.java deleted file mode 100644 index 5a61a6c381..0000000000 --- a/src/main/java/nextstep/fp/Conditional.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.fp; - -@FunctionalInterface -public interface Conditional { - boolean test(Integer number); -} diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index 81ed2fb841..008f92fd50 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.function.Function; +import java.util.function.Predicate; public class Lambda { public static void printAllOld(List numbers) { @@ -39,7 +40,7 @@ public static int sumAllOverThree(List numbers) { return sumAll(numbers, number -> number > 3); } - private static int sumAll(List numbers, Conditional condition) { + private static int sumAll(List numbers, Predicate condition) { int total = 0; for (int number : numbers) { if (condition.test(number)) { From a49b8927ced69e4632a9704dd7ce56c5388dc9bf Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 11:08:58 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20ComputerStore=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/ComputerStore.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 2695c967ac..e68a7f9cba 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -1,5 +1,6 @@ package nextstep.optional; +import java.util.Optional; import nextstep.optional.Computer.Soundcard; import nextstep.optional.Computer.USB; @@ -21,6 +22,10 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - return null; + return Optional.ofNullable(computer) + .map(Computer::getSoundcard) + .map(Soundcard::getUsb) + .map(USB::getVersion) + .orElse(UNKNOWN_VERSION); } } From 3bd88d87ecd6b5a2a00f129e0e9227a2b64ee2ef Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 11:19:57 +0900 Subject: [PATCH 03/11] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index e3e14da0ee..c9bfefc9e2 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,18 @@ - Optional을 활용해 조건에 따른 반환 - Optional에서 값을 반환 - Optional에서 exception 처리 + +## 사다리 게임 기능 목록 + +1. 사용자 입력 처리 +- [ ] 참여자 이름 입력 받기 (쉼표로 구분) +- [ ] 이름 유효성 검사 (최대 5글자) +- [ ] 사다리 높이 입력 받기 (숫자) +2. 사다리 생성 +- [ ] 사다리 높이만큼 행 생성 +- [ ] 참여자 수에 맞게 열 생성 +- [ ] 랜덤으로 가로 연결선 생성 (겹치지 않게) +3. 사다리 출력 +- [ ] 참여자 이름 출력 (5자 기준 정렬) +- [ ] 사다리 모양 출력 ("|", "-" 사용) + From 0fe53e2adf5cd4d3636174d96157c368eb99cf4b Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 11:33:14 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A6=84=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20(=EC=B5=9C=EB=8C=80?= =?UTF-8?q?=205=EA=B8=80=EC=9E=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/domain/Player.java | 24 ++++++++++++++++++++++++ src/test/java/domain/PlayerTest.java | 27 +++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/main/java/domain/Player.java create mode 100644 src/test/java/domain/PlayerTest.java diff --git a/README.md b/README.md index c9bfefc9e2..6a9ec8e5e0 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ 1. 사용자 입력 처리 - [ ] 참여자 이름 입력 받기 (쉼표로 구분) -- [ ] 이름 유효성 검사 (최대 5글자) +- [x] 이름 유효성 검사 (최대 5글자) - [ ] 사다리 높이 입력 받기 (숫자) 2. 사다리 생성 - [ ] 사다리 높이만큼 행 생성 diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java new file mode 100644 index 0000000000..e48df1e6ff --- /dev/null +++ b/src/main/java/domain/Player.java @@ -0,0 +1,24 @@ +package domain; + +public class Player { + private final String name; + + public Player(String name) { + validate(name); + this.name = name; + } + + private void validate(String name) { + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("이름은 필수입니다."); + } + + if (name.length() > 5) { + throw new IllegalArgumentException("이름은 최대 5글자입니다."); + } + } + + public String getName() { + return name; + } +} diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java new file mode 100644 index 0000000000..a162ada9dc --- /dev/null +++ b/src/test/java/domain/PlayerTest.java @@ -0,0 +1,27 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class PlayerTest { + + @Test + @DisplayName("플레이어 생성") + void createPlayer() { + Player player = new Player("홍길동"); + assertThat(player.getName()).isEqualTo("홍길동"); + } + + @Test + @DisplayName("플레이어 이름은 최대 5글자이다") + void playerNameMaxLength() { + assertThatThrownBy(() -> new Player("123456")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("이름은 최대 5글자입니다."); + } + + +} From 3173f83456caa8aae1f05beba77c9b3d2695e48d Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 13:20:36 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 11 +++++++++++ src/main/java/domain/Player.java | 3 --- src/test/java/domain/LadderTest.java | 14 ++++++++++++++ src/test/java/domain/PlayerTest.java | 3 +-- 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 src/main/java/domain/Ladder.java create mode 100644 src/test/java/domain/LadderTest.java diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java new file mode 100644 index 0000000000..c823404bb9 --- /dev/null +++ b/src/main/java/domain/Ladder.java @@ -0,0 +1,11 @@ +package domain; + +public class Ladder { + private final int height; + private final int width; + + public Ladder(int height, int width) { + this.height = height; + this.width = width; + } +} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index e48df1e6ff..aa4189a453 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -18,7 +18,4 @@ private void validate(String name) { } } - public String getName() { - return name; - } } diff --git a/src/test/java/domain/LadderTest.java b/src/test/java/domain/LadderTest.java new file mode 100644 index 0000000000..c82bcce67f --- /dev/null +++ b/src/test/java/domain/LadderTest.java @@ -0,0 +1,14 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class LadderTest { + @Test + @DisplayName("사다리 생성") + void createLadder() { + assertThat(new Ladder(3, 4)).isNotNull(); + } +} \ No newline at end of file diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index a162ada9dc..fa66896f10 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -11,8 +11,7 @@ public class PlayerTest { @Test @DisplayName("플레이어 생성") void createPlayer() { - Player player = new Player("홍길동"); - assertThat(player.getName()).isEqualTo("홍길동"); + assertThat(new Player("홍길동")).isNotNull(); } @Test From b3b4978b73f4b705b61b3035cdc8e15e63542ddd Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 13:30:41 +0900 Subject: [PATCH 06/11] feat: Input, Result view --- README.md | 4 +-- src/main/java/LadderGameApplication.java | 19 +++++++++++++ src/main/java/domain/Player.java | 3 ++ src/main/java/view/InputView.java | 35 ++++++++++++++++++++++++ src/main/java/view/ResultView.java | 17 ++++++++++++ 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/main/java/LadderGameApplication.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/ResultView.java diff --git a/README.md b/README.md index 6a9ec8e5e0..deb4f6743b 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ ## 사다리 게임 기능 목록 1. 사용자 입력 처리 -- [ ] 참여자 이름 입력 받기 (쉼표로 구분) +- [x] 참여자 이름 입력 받기 (쉼표로 구분) - [x] 이름 유효성 검사 (최대 5글자) -- [ ] 사다리 높이 입력 받기 (숫자) +- [x] 사다리 높이 입력 받기 (숫자) 2. 사다리 생성 - [ ] 사다리 높이만큼 행 생성 - [ ] 참여자 수에 맞게 열 생성 diff --git a/src/main/java/LadderGameApplication.java b/src/main/java/LadderGameApplication.java new file mode 100644 index 0000000000..f0432a3dc1 --- /dev/null +++ b/src/main/java/LadderGameApplication.java @@ -0,0 +1,19 @@ +import view.InputView; +import view.ResultView; +import domain.Ladder; +import domain.Player; + +import java.util.List; +import java.util.stream.Collectors; + +public class LadderGameApplication { + + public static void main(String[] args) { + List players = InputView.inputPlayers().stream() + .map(Player::new) + .collect(Collectors.toList()); + int ladderHeight = InputView.inputLadderHeight(); + Ladder ladder = new Ladder(ladderHeight, players.size()); + ResultView.printResult(players, ladder); + } +} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index aa4189a453..e48df1e6ff 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -18,4 +18,7 @@ private void validate(String name) { } } + public String getName() { + return name; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..f5608aa37f --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,35 @@ +package view; + +import java.util.Scanner; +import java.util.List; + +public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + public static List inputPlayers() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + return parseCommaSeparatedString(scanner.nextLine()); + } + + public static int inputLadderHeight() { + System.out.println("최대 사다리 높이는 몇 개 인가요?"); + return parseInt(scanner.nextLine()); + } + + private static int parseInt(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자를 입력해주세요."); + } + } + + private static List parseCommaSeparatedString(String input) { + try { + return List.of(input.split(",")); + } catch (NullPointerException e) { + throw new IllegalArgumentException("쉼표(,)로 구분된 문자열을 입력해주세요."); + } + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 0000000000..054ca01e2e --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,17 @@ +package view; + +import domain.Ladder; +import domain.Player; + +import java.util.List; + +public class ResultView { + public static void printResult(List players, Ladder ladder) { + System.out.println("실행 결과"); + for (Player player : players) { + System.out.print(player.getName()); + } + System.out.println(); + System.out.println(ladder.toString()); + } +} From f62bbffc06ac14ffbbc883d5aeb21816bd2f9414 Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 13:58:42 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20LadderRow=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++---- src/main/java/domain/Ladder.java | 17 +++++++++++++---- src/main/java/domain/LadderRow.java | 19 +++++++++++++++++++ src/main/java/view/ResultView.java | 10 ++++++++-- src/test/java/domain/LadderRowTest.java | 15 +++++++++++++++ 5 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 src/main/java/domain/LadderRow.java create mode 100644 src/test/java/domain/LadderRowTest.java diff --git a/README.md b/README.md index deb4f6743b..52c3499ceb 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,11 @@ - [x] 이름 유효성 검사 (최대 5글자) - [x] 사다리 높이 입력 받기 (숫자) 2. 사다리 생성 -- [ ] 사다리 높이만큼 행 생성 -- [ ] 참여자 수에 맞게 열 생성 -- [ ] 랜덤으로 가로 연결선 생성 (겹치지 않게) +- [x] 사다리 높이만큼 행 생성 +- [x] 참여자 수에 맞게 열 생성 +- [x] 랜덤으로 가로 연결선 생성 +- [ ] 가로 연결선 겹치면 안됨 3. 사다리 출력 - [ ] 참여자 이름 출력 (5자 기준 정렬) -- [ ] 사다리 모양 출력 ("|", "-" 사용) +- [x] 사다리 모양 출력 ("|", "-" 사용) diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index c823404bb9..a4f3ba2a07 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -1,11 +1,20 @@ package domain; +import java.util.ArrayList; +import java.util.List; + public class Ladder { - private final int height; - private final int width; + + private final List ladderRows = new ArrayList<>(); public Ladder(int height, int width) { - this.height = height; - this.width = width; + for (int i = 0; i < height; i++) { + ladderRows.add(new LadderRow(width)); + } } + + public List getLadderRows() { + return ladderRows; + } + } diff --git a/src/main/java/domain/LadderRow.java b/src/main/java/domain/LadderRow.java new file mode 100644 index 0000000000..d116c7102d --- /dev/null +++ b/src/main/java/domain/LadderRow.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class LadderRow { + + private final List columns = new ArrayList<>(); + + public LadderRow(int width) { + for (int i = 0; i < width - 1; i++) { + columns.add(Math.random() < 0.5); + } + } + + public List getColumns() { + return columns; + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 054ca01e2e..55dca60417 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,6 +1,7 @@ package view; import domain.Ladder; +import domain.LadderRow; import domain.Player; import java.util.List; @@ -9,9 +10,14 @@ public class ResultView { public static void printResult(List players, Ladder ladder) { System.out.println("실행 결과"); for (Player player : players) { - System.out.print(player.getName()); + System.out.print(String.format("%-5s", player.getName())); } System.out.println(); - System.out.println(ladder.toString()); + + for (LadderRow ladderRow : ladder.getLadderRows()) { + System.out.print(" |"); + ladderRow.getColumns().forEach(column -> System.out.print(column ? "----|" : " |")); + System.out.println(); + } } } diff --git a/src/test/java/domain/LadderRowTest.java b/src/test/java/domain/LadderRowTest.java new file mode 100644 index 0000000000..7cd3f38e31 --- /dev/null +++ b/src/test/java/domain/LadderRowTest.java @@ -0,0 +1,15 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LadderRowTest { + + @DisplayName("사다리 행을 생성한다.") + @Test + void createLadderRow() { + assertThat(new LadderRow(5)).isNotNull(); + } +} From e0681c1e3798cd067ff68c87b7ebe8d3910a2716 Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 15:08:30 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=B6=9C=EB=A0=A5=20(5=EC=9E=90=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=A0=95=EB=A0=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/view/ResultView.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 52c3499ceb..7ab5989e1d 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,6 @@ - [x] 랜덤으로 가로 연결선 생성 - [ ] 가로 연결선 겹치면 안됨 3. 사다리 출력 -- [ ] 참여자 이름 출력 (5자 기준 정렬) +- [x] 참여자 이름 출력 (5자 기준 정렬) - [x] 사다리 모양 출력 ("|", "-" 사용) diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 55dca60417..6e1afec632 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -10,13 +10,13 @@ public class ResultView { public static void printResult(List players, Ladder ladder) { System.out.println("실행 결과"); for (Player player : players) { - System.out.print(String.format("%-5s", player.getName())); + System.out.print(String.format("%-5s ", player.getName())); } System.out.println(); for (LadderRow ladderRow : ladder.getLadderRows()) { - System.out.print(" |"); - ladderRow.getColumns().forEach(column -> System.out.print(column ? "----|" : " |")); + System.out.print("|"); + ladderRow.getColumns().forEach(column -> System.out.print(column ? "-----|" : " |")); System.out.println(); } } From 6d6b97300330fcecee3f133e0a0fa036c239d823 Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 15:34:15 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=EA=B0=80=EB=A1=9C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=EC=84=A0=20=EA=B2=B9=EC=B9=98=EB=A9=B4=20=EC=95=88?= =?UTF-8?q?=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/domain/Ladder.java | 5 ++++- src/main/java/domain/LadderRow.java | 19 +++++++++++++++++-- src/test/java/domain/LadderRowTest.java | 18 +++++++++++++++--- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7ab5989e1d..f5add406e4 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ - [x] 사다리 높이만큼 행 생성 - [x] 참여자 수에 맞게 열 생성 - [x] 랜덤으로 가로 연결선 생성 -- [ ] 가로 연결선 겹치면 안됨 +- [x] 가로 연결선 겹치면 안됨 3. 사다리 출력 - [x] 참여자 이름 출력 (5자 기준 정렬) - [x] 사다리 모양 출력 ("|", "-" 사용) diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index a4f3ba2a07..b6c7def11a 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -2,14 +2,17 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class Ladder { + private static final Random RANDOM = new Random(); + private final List ladderRows = new ArrayList<>(); public Ladder(int height, int width) { for (int i = 0; i < height; i++) { - ladderRows.add(new LadderRow(width)); + ladderRows.add(new LadderRow(width, () -> RANDOM.nextBoolean())); } } diff --git a/src/main/java/domain/LadderRow.java b/src/main/java/domain/LadderRow.java index d116c7102d..744695aad5 100644 --- a/src/main/java/domain/LadderRow.java +++ b/src/main/java/domain/LadderRow.java @@ -2,15 +2,30 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public class LadderRow { private final List columns = new ArrayList<>(); - public LadderRow(int width) { + public LadderRow(int width, Supplier connectionFunction) { + initializeColumns(width, connectionFunction); + } + + private void initializeColumns(int width, Supplier connectionFunction) { + boolean prevPoint = false; for (int i = 0; i < width - 1; i++) { - columns.add(Math.random() < 0.5); + boolean isConnected = determineConnection(prevPoint, connectionFunction); + columns.add(isConnected); + prevPoint = isConnected; + } + } + + private boolean determineConnection(boolean prevPoint, Supplier connectionFunction) { + if (prevPoint) { + return false; } + return connectionFunction.get(); } public List getColumns() { diff --git a/src/test/java/domain/LadderRowTest.java b/src/test/java/domain/LadderRowTest.java index 7cd3f38e31..37d3814bae 100644 --- a/src/test/java/domain/LadderRowTest.java +++ b/src/test/java/domain/LadderRowTest.java @@ -5,11 +5,23 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; + class LadderRowTest { - @DisplayName("사다리 행을 생성한다.") @Test - void createLadderRow() { - assertThat(new LadderRow(5)).isNotNull(); + @DisplayName("사다리 행의 열은 전체 너비 - 1 만큼 생성된다.") + void createColumns() { + LadderRow ladderRow = new LadderRow(5, () -> true); + assertThat(ladderRow.getColumns()).hasSize(4); + } + + @Test + @DisplayName("사다리에서 연결된 다음 열은 연결되지 않는다.") + void adjacentConnectionsDoNotOverlap() { + LadderRow ladderRow = new LadderRow(5, () -> true); + List columns = ladderRow.getColumns(); + + assertThat(columns).containsExactly(true, false, true, false); } } From 3e2d84dfdc0f5057d2f1c3ad2086424d5e58bb8a Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 15:52:44 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20Players=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20getter=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/LadderGameApplication.java | 9 +++----- src/main/java/domain/Ladder.java | 7 +++---- src/main/java/domain/LadderRow.java | 5 +++-- src/main/java/domain/Players.java | 26 ++++++++++++++++++++++++ src/main/java/view/InputView.java | 6 +++--- src/main/java/view/ResultView.java | 13 ++++++------ src/test/java/domain/LadderRowTest.java | 14 +++++++++---- 7 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 src/main/java/domain/Players.java diff --git a/src/main/java/LadderGameApplication.java b/src/main/java/LadderGameApplication.java index f0432a3dc1..4818c4a9a7 100644 --- a/src/main/java/LadderGameApplication.java +++ b/src/main/java/LadderGameApplication.java @@ -1,18 +1,15 @@ import view.InputView; import view.ResultView; import domain.Ladder; -import domain.Player; +import domain.Players; -import java.util.List; -import java.util.stream.Collectors; public class LadderGameApplication { public static void main(String[] args) { - List players = InputView.inputPlayers().stream() - .map(Player::new) - .collect(Collectors.toList()); + Players players = InputView.inputPlayers(); int ladderHeight = InputView.inputLadderHeight(); + Ladder ladder = new Ladder(ladderHeight, players.size()); ResultView.printResult(players, ladder); } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index b6c7def11a..2ed55eaf81 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; - +import java.util.function.Consumer; public class Ladder { private static final Random RANDOM = new Random(); @@ -16,8 +16,7 @@ public Ladder(int height, int width) { } } - public List getLadderRows() { - return ladderRows; + public void forEach(Consumer consumer) { + ladderRows.forEach(consumer); } - } diff --git a/src/main/java/domain/LadderRow.java b/src/main/java/domain/LadderRow.java index 744695aad5..66a406dba6 100644 --- a/src/main/java/domain/LadderRow.java +++ b/src/main/java/domain/LadderRow.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +import java.util.function.Consumer; public class LadderRow { @@ -28,7 +29,7 @@ private boolean determineConnection(boolean prevPoint, Supplier connect return connectionFunction.get(); } - public List getColumns() { - return columns; + public void forEach(Consumer consumer) { + columns.forEach(consumer); } } diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java new file mode 100644 index 0000000000..b24292707b --- /dev/null +++ b/src/main/java/domain/Players.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class Players { + + private final List players; + + public Players(List playerNames) { + if (playerNames == null) { + throw new IllegalArgumentException("플레이어가 존재하지 않습니다."); + } + this.players = playerNames.stream() + .map(Player::new) + .collect(Collectors.toList()); + } + + public int size() { + return players.size(); + } + + public List getPlayers() { + return players; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index f5608aa37f..7b97e12b3f 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,14 +2,14 @@ import java.util.Scanner; import java.util.List; - +import domain.Players; public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static List inputPlayers() { + public static Players inputPlayers() { System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); - return parseCommaSeparatedString(scanner.nextLine()); + return new Players(parseCommaSeparatedString(scanner.nextLine())); } public static int inputLadderHeight() { diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 6e1afec632..5e31feee85 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -3,21 +3,20 @@ import domain.Ladder; import domain.LadderRow; import domain.Player; - -import java.util.List; +import domain.Players; public class ResultView { - public static void printResult(List players, Ladder ladder) { + public static void printResult(Players players, Ladder ladder) { System.out.println("실행 결과"); - for (Player player : players) { + for (Player player : players.getPlayers()) { System.out.print(String.format("%-5s ", player.getName())); } System.out.println(); - for (LadderRow ladderRow : ladder.getLadderRows()) { + ladder.forEach(ladderRow -> { System.out.print("|"); - ladderRow.getColumns().forEach(column -> System.out.print(column ? "-----|" : " |")); + ladderRow.forEach(column -> System.out.print(column ? "-----|" : " |")); System.out.println(); - } + }); } } diff --git a/src/test/java/domain/LadderRowTest.java b/src/test/java/domain/LadderRowTest.java index 37d3814bae..9cb86bf946 100644 --- a/src/test/java/domain/LadderRowTest.java +++ b/src/test/java/domain/LadderRowTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,15 +14,20 @@ class LadderRowTest { @DisplayName("사다리 행의 열은 전체 너비 - 1 만큼 생성된다.") void createColumns() { LadderRow ladderRow = new LadderRow(5, () -> true); - assertThat(ladderRow.getColumns()).hasSize(4); + AtomicInteger count = new AtomicInteger(); + ladderRow.forEach(column -> count.getAndIncrement()); + assertThat(count.get()).isEqualTo(4); } @Test @DisplayName("사다리에서 연결된 다음 열은 연결되지 않는다.") void adjacentConnectionsDoNotOverlap() { LadderRow ladderRow = new LadderRow(5, () -> true); - List columns = ladderRow.getColumns(); - - assertThat(columns).containsExactly(true, false, true, false); + List expected = List.of(true, false, true, false); + + AtomicInteger index = new AtomicInteger(); + ladderRow.forEach(column -> { + assertThat(column).isEqualTo(expected.get(index.getAndIncrement())); + }); } } From 9c11212877ace2a0d899e24170e28844e6f87747 Mon Sep 17 00:00:00 2001 From: panya Date: Mon, 14 Apr 2025 15:58:12 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor:=20Players=EC=9D=98=20getter=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Players.java | 5 +++++ src/main/java/view/ResultView.java | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java index b24292707b..6b35ceaf5d 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/Players.java @@ -1,6 +1,7 @@ package domain; import java.util.List; +import java.util.function.Consumer; import java.util.stream.Collectors; public class Players { @@ -20,6 +21,10 @@ public int size() { return players.size(); } + public void forEach(Consumer consumer) { + players.forEach(consumer); + } + public List getPlayers() { return players; } diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 5e31feee85..2490f6357e 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,16 +1,12 @@ package view; import domain.Ladder; -import domain.LadderRow; -import domain.Player; import domain.Players; public class ResultView { public static void printResult(Players players, Ladder ladder) { System.out.println("실행 결과"); - for (Player player : players.getPlayers()) { - System.out.print(String.format("%-5s ", player.getName())); - } + players.forEach(player -> System.out.printf("%-5s ", player.getName())); System.out.println(); ladder.forEach(ladderRow -> {