From 5480bcb676acca04ffb31d5ced10c127837295fe Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 9 Mar 2023 09:37:47 +0900 Subject: [PATCH 01/24] =?UTF-8?q?feat:=20=EC=82=AC=EB=9E=8C=EC=88=98,=20?= =?UTF-8?q?=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=86=92=EC=9D=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=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 --- .gitignore | 1 + .idea/workspace.xml | 38 ++++++++++++++++----- README.md | 36 ++++++++++++++++++++ src/main/java/kr/codesquad/Console.java | 18 ++++++++++ src/main/java/kr/codesquad/Ladder.java | 5 +++ src/main/java/kr/codesquad/LadderGame.java | 39 ++++++++++++++++++++++ src/main/java/kr/codesquad/Main.java | 3 +- 7 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 src/main/java/kr/codesquad/Console.java create mode 100644 src/main/java/kr/codesquad/Ladder.java create mode 100644 src/main/java/kr/codesquad/LadderGame.java diff --git a/.gitignore b/.gitignore index b63da455..8ec73278 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ build/ !**/src/test/**/build/ ### IntelliJ IDEA ### +.idea .idea/modules.xml .idea/jarRepositories.xml .idea/compiler.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml index cc0a8fd0..30089011 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,15 +5,12 @@ - - - - - - - + + + - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1672210428730 - - - - - - \ No newline at end of file From acb38405c38859bf05f4ebd65a71037d033ed84f Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 9 Mar 2023 15:35:35 +0900 Subject: [PATCH 05/24] =?UTF-8?q?refactor:=20Ladder=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit for문을 향상된 for문을 전환하였습니다. - 배열 전체를 읽고 출력만 하므로 인덱스가 필요없습니다. - 가독성 향상 if문을 삼항연산자로 대체하였습니다. - 코드 축약 --- src/main/java/kr/codesquad/Ladder.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/Ladder.java index 12a02067..4ffac70e 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/Ladder.java @@ -10,16 +10,14 @@ public Ladder(boolean[][] ladder) { @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (int row = 0; row < ladder.length; row++) { - for (int col = 0; col < ladder[0].length-1; col++) { - if (ladder[row][col]) { - sb.append("|-"); - continue; - } - sb.append("| "); + for (boolean[] row : ladder) { + for (boolean hasLine : row) { + String line = hasLine ? "|-" : "| "; + sb.append(line); } - sb.append("|\n"); + sb.append("\n"); } + return String.valueOf(sb); } } From 49b211889e10c069ab9ad070d5a35b32c443e0ba Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 9 Mar 2023 15:36:37 +0900 Subject: [PATCH 06/24] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=EC=95=88?= =?UTF-8?q?=ED=95=98=EB=8A=94=20import=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/codesquad/RandomLadderGenerator.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/kr/codesquad/RandomLadderGenerator.java b/src/main/java/kr/codesquad/RandomLadderGenerator.java index 61ecdfee..d753da77 100644 --- a/src/main/java/kr/codesquad/RandomLadderGenerator.java +++ b/src/main/java/kr/codesquad/RandomLadderGenerator.java @@ -1,8 +1,6 @@ package kr.codesquad; import java.util.Random; -import java.util.function.Supplier; -import java.util.stream.Stream; public class RandomLadderGenerator { private final Random random = new Random(); From dfabeb675d85e3ce9dd9e207e12ddaec696dbdca Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 9 Mar 2023 15:38:40 +0900 Subject: [PATCH 07/24] =?UTF-8?q?refactor:=20Console=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 입력값이 없을 시 IOException을 날리지 않고 다시 입력을 받도록 재귀호출로 변경하였습니다. --- src/main/java/kr/codesquad/Console.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/codesquad/Console.java b/src/main/java/kr/codesquad/Console.java index e4a7e006..17541bd3 100644 --- a/src/main/java/kr/codesquad/Console.java +++ b/src/main/java/kr/codesquad/Console.java @@ -3,13 +3,18 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Optional; public class Console { private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - public String input(String prompt) throws IOException { + public String input(String prompt) { System.out.println(prompt); - return br.readLine(); + try { + return br.readLine(); + } catch (IOException e) { + return input(prompt); + } } public void inputError() { From aaa66b4aa74f2eb41fac44f8750321075e3d621b Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 9 Mar 2023 15:47:54 +0900 Subject: [PATCH 08/24] =?UTF-8?q?refactor:=20LadderGame=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출력문과 제한값을 파라미터로 가지는 inputToValue 메소드를 추가하였습니다. - 사람 수 입력과 사다리 높이 입력은 유사한 코드를 사용하므로 이를 하나의 메소드로 만들어 재사용이 가능합니다. - run()메소드의 코드 축약 parse메소드가 IOException을 던지지않고 에러 방지를 위해 Optional 객체를 사용합니다. --- src/main/java/kr/codesquad/LadderGame.java | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index b1b64847..19cf559e 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -1,6 +1,6 @@ package kr.codesquad; -import java.io.IOException; +import java.util.Optional; public class LadderGame implements Runnable { private final int MIN_SIZE_OF_PEOPLE = 2; @@ -16,28 +16,32 @@ public LadderGame(Console console, RandomLadderGenerator generator) { @Override public void run() { int sizeOfPeople, sizeOfLadder; - while (true) { - try { - String inputString = console.input("참여할 사람은 몇 명인가요?"); - sizeOfPeople = parse(inputString, MIN_SIZE_OF_PEOPLE); - inputString = console.input("최대 사다리 높이는 몇 개인가요?"); - sizeOfLadder = parse(inputString, MIN_SIZE_OF_LADDER); - break; - } catch (IOException | NumberFormatException e) { - console.inputError(); - } - } + sizeOfPeople = inputToValue("참여할 사람은 몇 명인가요?", MIN_SIZE_OF_PEOPLE); + sizeOfLadder = inputToValue("최대 사다리 높이는 몇 개인가요?", MIN_SIZE_OF_LADDER); Ladder ladder = generator.generate(sizeOfPeople,sizeOfLadder); System.out.println(ladder); } - private int parse(String inputString, int limit) throws IOException { - int result = Integer.parseInt(inputString); - if (result < limit) { - throw new IOException(); + private Optional parse(String inputString, int limit) { + try { + int result = Integer.parseInt(inputString); + if (result < limit) return Optional.empty(); + return Optional.of(result); + } catch (NumberFormatException e) { + return Optional.empty(); } - return result; } + private int inputToValue(String prompt, int limit) { + while (true) { + String inputString = console.input(prompt); + Optional parsedValue = parse(inputString, limit); + if (parsedValue.isEmpty()) { + console.inputError(); + continue; + } + return parsedValue.get(); + } + } } From d1b072771bab2a0321c5cbf2c392ba5e78684541 Mon Sep 17 00:00:00 2001 From: LaStella Date: Fri, 10 Mar 2023 11:23:39 +0900 Subject: [PATCH 09/24] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EC=9D=B4=EB=A6=84=EC=9D=84=20ArrayList=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=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 사람 이름을 입력받으므로 사다리 높이 변환과정과 달라 다른 메소드로 분리하였습니다. 사람 이름을 ArrayList로 변환하는 과정에서 유효한 값을 확인하는 메소드isValidPlayer를 추가하였습니다. 사람 이름과 사다리 입력을 각각 서로 다른 메소드가 처리하므로 메소드명을 수정하였습니다. 이름과 좌표(row, col)를 속성으로 가지는 Player를 클래스를 추가하였습니다. 사람을 Player객체로 나타냅니다. --- src/main/java/kr/codesquad/LadderGame.java | 43 ++++++++++++++++++---- src/main/java/kr/codesquad/Player.java | 13 +++++++ 2 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 src/main/java/kr/codesquad/Player.java diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 19cf559e..3db3b121 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -1,5 +1,7 @@ package kr.codesquad; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Optional; public class LadderGame implements Runnable { @@ -15,28 +17,53 @@ public LadderGame(Console console, RandomLadderGenerator generator) { @Override public void run() { - int sizeOfPeople, sizeOfLadder; - sizeOfPeople = inputToValue("참여할 사람은 몇 명인가요?", MIN_SIZE_OF_PEOPLE); - sizeOfLadder = inputToValue("최대 사다리 높이는 몇 개인가요?", MIN_SIZE_OF_LADDER); + ArrayList playerArrayList = inputPlayersToPlayerList("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + int sizeOfLadder = inputToLadderSize("최대 사다리 높이는 몇 개인가요?"); - Ladder ladder = generator.generate(sizeOfPeople,sizeOfLadder); + Ladder ladder = generator.generate(playerArrayList.size(),sizeOfLadder); System.out.println(ladder); } - private Optional parse(String inputString, int limit) { + private ArrayList inputPlayersToPlayerList(String prompt) { + String inputString = console.input(prompt); + Optional> parsedValue = parsePlayerList(inputString); + if (parsedValue.isEmpty()) { + console.inputError(); + return inputPlayersToPlayerList(prompt); + } + return parsedValue.get(); + } + private Optional> parsePlayerList(String inputString) { + String[] playerNames = inputString.split(","); + if (!isValidPlayer(playerNames)) return Optional.empty(); + + ArrayList result = new ArrayList<>(); + for (int i = 0; i < playerNames.length; i++) { + result.add(new Player(playerNames[i], i)); + } + return Optional.of(result); + } + + private boolean isValidPlayer(String[] playerNames) { + if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 + var count = Arrays.stream(playerNames).filter(name -> name.length() > 5).count(); + return count == 0; + } + + private Optional parseLadderSize(String inputString) { try { int result = Integer.parseInt(inputString); - if (result < limit) return Optional.empty(); + if (result < MIN_SIZE_OF_LADDER) return Optional.empty(); return Optional.of(result); } catch (NumberFormatException e) { return Optional.empty(); } } - private int inputToValue(String prompt, int limit) { + private int inputToLadderSize(String prompt) { while (true) { String inputString = console.input(prompt); - Optional parsedValue = parse(inputString, limit); + Optional parsedValue = parseLadderSize(inputString); if (parsedValue.isEmpty()) { console.inputError(); continue; diff --git a/src/main/java/kr/codesquad/Player.java b/src/main/java/kr/codesquad/Player.java new file mode 100644 index 00000000..6ed16dcb --- /dev/null +++ b/src/main/java/kr/codesquad/Player.java @@ -0,0 +1,13 @@ +package kr.codesquad; + +public class Player { + private final String name; + private int col; + private int row; + + public Player(String name, int col) { + this.name = name; + this.col = col; + this.row = 0; + } +} From e308ddb05d738965af1079e49dbe7a9fe1157be3 Mon Sep 17 00:00:00 2001 From: LaStella Date: Mon, 13 Mar 2023 10:12:32 +0900 Subject: [PATCH 10/24] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=EC=9D=84=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=ED=95=9C=20=EC=97=B4?= =?UTF-8?q?=EC=97=90=20=EB=91=90=20=EB=9D=BC=EC=9D=B8=EC=9D=B4=20=EA=B2=B9?= =?UTF-8?q?=EC=B9=98=EC=A7=80=20=EC=95=8A=EB=8A=94=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 boolean[][] ladder 를 ArrayList> ladder로 변경하였습니다. 라인을 랜덤하게 생성 시 이전 열(col-1)에서 라인이 존재하는 경우 false, 존재하지 않는 경우 임의의 boolean값이 현재 열(col)에 저장됩니다. --- src/main/java/kr/codesquad/Ladder.java | 8 +++++--- src/main/java/kr/codesquad/RandomLadderGenerator.java | 11 ++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/Ladder.java index 4ffac70e..bba9fcf6 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/Ladder.java @@ -1,16 +1,18 @@ package kr.codesquad; +import java.util.ArrayList; + public class Ladder { - private final boolean[][] ladder; + private final ArrayList> ladder; - public Ladder(boolean[][] ladder) { + public Ladder(ArrayList> ladder) { this.ladder = ladder; } @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (boolean[] row : ladder) { + for (ArrayList row : ladder) { for (boolean hasLine : row) { String line = hasLine ? "|-" : "| "; sb.append(line); diff --git a/src/main/java/kr/codesquad/RandomLadderGenerator.java b/src/main/java/kr/codesquad/RandomLadderGenerator.java index d753da77..d8fba777 100644 --- a/src/main/java/kr/codesquad/RandomLadderGenerator.java +++ b/src/main/java/kr/codesquad/RandomLadderGenerator.java @@ -1,16 +1,21 @@ package kr.codesquad; +import java.util.ArrayList; import java.util.Random; public class RandomLadderGenerator { private final Random random = new Random(); public Ladder generate(int sizeOfPeople, int sizeOfLadder) { - boolean[][] ladder = new boolean[sizeOfLadder][sizeOfPeople]; + ArrayList> ladder = new ArrayList<>(sizeOfLadder); for (int row = 0; row < sizeOfLadder; row++) { - for (int col = 0; col < sizeOfPeople-1; col++) { - ladder[row][col] = random.nextBoolean(); + ladder.add(new ArrayList<>()); + ladder.get(row).add(random.nextBoolean()); + for (int col = 1; col < sizeOfPeople-1; col++) { + boolean hasLine = ladder.get(row).get(col-1) ? false : random.nextBoolean(); // 이전 열의 라인 유무확인 + ladder.get(row).add(hasLine); } + ladder.get(row).add(false); // 마지막 열은 라인이 없으므로 false를 저장한다. } return new Ladder(ladder); From 47a96e0a1537b72d477063965a61d8888a74eebf Mon Sep 17 00:00:00 2001 From: LaStella Date: Mon, 13 Mar 2023 16:15:43 +0900 Subject: [PATCH 11/24] =?UTF-8?q?docs:=20=EC=A3=BC=EA=B0=84=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=EA=B3=84=ED=9A=8D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3월 13일부터 3월 17일까지 주간 학습 계획 일정을 추가하였습니다. --- README.md | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index f950dc7f..8004bec1 100644 --- a/README.md +++ b/README.md @@ -27,19 +27,32 @@ - 사람의 이름을 최대 5자로 정하므로 이에 따라 사다리의 폭도 넓게 출력한다 ## 구현 계획 및 학습 계획 -일정이 없는 항목은 위 항목의 일정과 같다. -- 사다리를 나타낼 배열을 먼저 구현한다 (3.7 화 오전까지) -- 사다리의 라인을 랜덤하게 구현한다 -- 사다리의 모습을 출력한다 (3.7 화 오후까지) -- 사람의 이름으로 사다리 배열을 구현한다 -- 같은 높이에서 라인이 겹치지 않으면서 랜덤하게 나타나도록 구현한다 (3.8 수 오후까지) -- 사람의 이름과 사다리를 출력한다 -- 자바 클린 코딩 기초 -- 자바 문자열 -- 리스트와 제네릭 (3.8 목 오후까지) -- Java Collection Framework -- TDD Basic -- Java Exception -- Java Enum (3.9 금 오후까지) -- SparkJava -- JVM +### 3.7 화 오전 +-[x] 사다리를 나타낼 배열을 먼저 구현한다 +-[x] 사다리의 라인을 랜덤하게 구현한다 +### 3.7 화 오후 +-[x] 사다리의 모습을 출력한다 (3.7 화 오후까지) +-[x] 사람의 이름으로 사다리 배열을 구현한다 +### ~~3.8 수~~ 3.13 월 +-[ ] 같은 높이에서 라인이 겹치지 않으면서 랜덤하게 나타나도록 구현한다 +-[ ] 사람의 이름과 사다리를 출력한다 +-[ ] 로직을 구현하는 단위테스트를 추가한다 +### ~~3.8 목~~ 3.14 화 +-[ ] 한 라인의 좌표 값을 가지는 객체를 추가해 구현한다 +-[ ] 클래스들을 역할에 맞게 패키지 분리한다 +-[ ] 실행 결과 입력기능을 구현한다 +### ~~3.9 금~~ 3.15 수 +-[ ] 개인별 결과를 출력한다 +-[ ] 전체 참여자의 결과를 출력한다 +-[ ] 춘식이 입력시 프로그램을 종료하는 기능을 구현한다. +### 3.16 목 +-[ ] 자바 클린 코딩 기초 +-[ ] 자바 문자열 +-[ ] 리스트와 제네릭 +-[ ] Java Collection Framework +-[ ] TDD Basic +### 3.17 금 +-[ ] Java Exception +-[ ] Java Enum +-[ ] SparkJava +-[ ] JVM \ No newline at end of file From 55ea7cf3b3bfe882745b8f3c2cbaa2126a0426d1 Mon Sep 17 00:00:00 2001 From: LaStella Date: Mon, 13 Mar 2023 16:28:20 +0900 Subject: [PATCH 12/24] =?UTF-8?q?refactor:=20LadderGame=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit inputToLadderSize메소드에서 while문을 대신 재귀호출하여 재입력하도록 수정하였습니다. - indent를 줄여 가독성 향상 메소드 사이에 간격을 추가하였습니다. --- src/main/java/kr/codesquad/LadderGame.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 3db3b121..7525997f 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -33,6 +33,7 @@ private ArrayList inputPlayersToPlayerList(String prompt) { } return parsedValue.get(); } + private Optional> parsePlayerList(String inputString) { String[] playerNames = inputString.split(","); if (!isValidPlayer(playerNames)) return Optional.empty(); @@ -61,14 +62,12 @@ private Optional parseLadderSize(String inputString) { } private int inputToLadderSize(String prompt) { - while (true) { - String inputString = console.input(prompt); - Optional parsedValue = parseLadderSize(inputString); - if (parsedValue.isEmpty()) { - console.inputError(); - continue; - } - return parsedValue.get(); + String inputString = console.input(prompt); + Optional parsedValue = parseLadderSize(inputString); + if (parsedValue.isEmpty()) { + console.inputError(); + return inputToLadderSize(prompt); } + return parsedValue.get(); } } From 601b1651834b27763f43d61244ec89af83cf6873 Mon Sep 17 00:00:00 2001 From: LaStella Date: Mon, 13 Mar 2023 16:45:46 +0900 Subject: [PATCH 13/24] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=82=AC=EB=9E=8C=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=84=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84,=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=AA=A8?= =?UTF-8?q?=EC=96=91=EC=9D=84=20=EC=82=AC=EB=9E=8C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사람이름을 출력하는 메소드 printPlayerList를 구현하였습니다. - 리스트안에 있는 사람들의 이름을 가운데 정렬하고 하나의 문자열로 출력합니다. 5글자를 기준으로 가운데 정렬하는 메소드 alignCenter를 구현하였습니다. - 5에서 이름의 길이를 뺀 만큼 이름의 앞, 뒤로 공백을 붙여 정렬합니다. player의 속성에 접근하고 변경할 수 있도록 getter와 setter를 추가하였습니다. --- src/main/java/kr/codesquad/Ladder.java | 3 ++- src/main/java/kr/codesquad/LadderGame.java | 20 +++++++++++++++++++- src/main/java/kr/codesquad/Player.java | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/Ladder.java index bba9fcf6..9da0b949 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/Ladder.java @@ -13,8 +13,9 @@ public Ladder(ArrayList> ladder) { public String toString() { StringBuilder sb = new StringBuilder(); for (ArrayList row : ladder) { + sb.append(" "); // 사람 이름 5글자가 기준이므로 사다리 앞에 2칸의 간격 추가 for (boolean hasLine : row) { - String line = hasLine ? "|-" : "| "; + String line = hasLine ? "|-----" : "| "; sb.append(line); } sb.append("\n"); diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 7525997f..41bfdc15 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -21,7 +21,25 @@ public void run() { int sizeOfLadder = inputToLadderSize("최대 사다리 높이는 몇 개인가요?"); Ladder ladder = generator.generate(playerArrayList.size(),sizeOfLadder); - System.out.println(ladder); + printPlayerList(playerArrayList); // 사람 이름 출력 + System.out.println(ladder); // 사다리 출력 + } + + private void printPlayerList(ArrayList playerArrayList) { + StringBuilder sb = new StringBuilder(); + for (var player : playerArrayList) { + sb.append(alignCenter(player.getName())).append(" "); + } + System.out.println(sb); + } + + // 5글자를 기준으로 이름을 가운데로 정렬하는 메소드 + private String alignCenter(String name) { + StringBuilder sb = new StringBuilder(); + while(sb.length() < (5-name.length())/2) sb.append(" "); + sb.append(name); + while(sb.length() < 5) sb.append(" "); + return sb.toString(); } private ArrayList inputPlayersToPlayerList(String prompt) { diff --git a/src/main/java/kr/codesquad/Player.java b/src/main/java/kr/codesquad/Player.java index 6ed16dcb..39a426c0 100644 --- a/src/main/java/kr/codesquad/Player.java +++ b/src/main/java/kr/codesquad/Player.java @@ -10,4 +10,24 @@ public Player(String name, int col) { this.col = col; this.row = 0; } + + public String getName() { + return name; + } + + public int getCol() { + return col; + } + + public int getRow() { + return row; + } + + public void setCol(int col) { + this.col = col; + } + + public void setRow(int row) { + this.row = row; + } } From eec8deb3aea3579997c4a6c58e32b4da78e5310f Mon Sep 17 00:00:00 2001 From: LaStella Date: Tue, 14 Mar 2023 10:00:25 +0900 Subject: [PATCH 14/24] =?UTF-8?q?test:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=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/kr/codesquad/Ladder.java | 4 +++ .../codesquad/RandomLadderGeneratorTest.java | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/test/java/kr/codesquad/RandomLadderGeneratorTest.java diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/Ladder.java index 9da0b949..ceff86f9 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/Ladder.java @@ -23,4 +23,8 @@ public String toString() { return String.valueOf(sb); } + + public ArrayList> getLadder() { + return ladder; + } } diff --git a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java new file mode 100644 index 00000000..ea81313e --- /dev/null +++ b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java @@ -0,0 +1,31 @@ +package kr.codesquad; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomLadderGeneratorTest { + @Test + @DisplayName("사다리의 라인은 겹치지 않습니다.") + public void testGenerate() { + RandomLadderGenerator generator = new RandomLadderGenerator(); + var ladder = generator.generate(5, 5); + for (var row : ladder.getLadder()) { + for (int i = 1 ; i < row.size()-1 ; i++) { + assertFalse(row.get(i) && row.get(i-1)); + assertFalse(row.get(i) && row.get(i+1)); + } + } + } + + @Test + @DisplayName("사다리의 마지막 열은 라인이 없습니다.") + public void testLastRow() { + RandomLadderGenerator generator = new RandomLadderGenerator(); + var ladder = generator.generate(5, 5); + for (var row : ladder.getLadder()) { + assertFalse(row.get(4)); + } + } +} \ No newline at end of file From 35107d0f59ca41c6b5bc6c5f2097c16c58e674fa Mon Sep 17 00:00:00 2001 From: LaStella Date: Tue, 14 Mar 2023 10:32:31 +0900 Subject: [PATCH 15/24] =?UTF-8?q?refactor:=20LadderGame=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최대 이름 길이(MAX_NAME_SIZE)를 상수로 만들어 사용합니다. - 가독성 향상 --- src/main/java/kr/codesquad/LadderGame.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 41bfdc15..66d3e5db 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -7,6 +7,7 @@ public class LadderGame implements Runnable { private final int MIN_SIZE_OF_PEOPLE = 2; private final int MIN_SIZE_OF_LADDER = 1; + private final int MAX_NAME_SIZE = 5; private final Console console; private final RandomLadderGenerator generator; @@ -36,9 +37,9 @@ private void printPlayerList(ArrayList playerArrayList) { // 5글자를 기준으로 이름을 가운데로 정렬하는 메소드 private String alignCenter(String name) { StringBuilder sb = new StringBuilder(); - while(sb.length() < (5-name.length())/2) sb.append(" "); + while(sb.length() < (MAX_NAME_SIZE-name.length())/2) sb.append(" "); sb.append(name); - while(sb.length() < 5) sb.append(" "); + while(sb.length() < MAX_NAME_SIZE) sb.append(" "); return sb.toString(); } @@ -65,7 +66,7 @@ private Optional> parsePlayerList(String inputString) { private boolean isValidPlayer(String[] playerNames) { if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 - var count = Arrays.stream(playerNames).filter(name -> name.length() > 5).count(); + var count = Arrays.stream(playerNames).filter(name -> name.length() > MAX_NAME_SIZE).count(); return count == 0; } From 0b4964e7393a64899b2e0035a228f2afb6b413ba Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 16 Mar 2023 10:11:46 +0900 Subject: [PATCH 16/24] =?UTF-8?q?refactor:=20isValidPlayer=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit count를 사용하지않고 allMatch를 사용하여 playersNames의 모든 값이 조건을 충족시키는지 확인합니다. --- src/main/java/kr/codesquad/LadderGame.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 66d3e5db..219150d1 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -66,8 +66,7 @@ private Optional> parsePlayerList(String inputString) { private boolean isValidPlayer(String[] playerNames) { if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 - var count = Arrays.stream(playerNames).filter(name -> name.length() > MAX_NAME_SIZE).count(); - return count == 0; + return Arrays.stream(playerNames).allMatch(name -> name.length() > MAX_NAME_SIZE); } private Optional parseLadderSize(String inputString) { From bd37f13a0508fdd34631160da4786dc3e51e2742 Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 16 Mar 2023 10:14:38 +0900 Subject: [PATCH 17/24] =?UTF-8?q?chore:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A3=BC=EC=84=9D=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/kr/codesquad/RandomLadderGeneratorTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java index ea81313e..9fca8789 100644 --- a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java +++ b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java @@ -7,12 +7,13 @@ class RandomLadderGeneratorTest { @Test - @DisplayName("사다리의 라인은 겹치지 않습니다.") - public void testGenerate() { + @DisplayName("랜덤하게 생성시 사다리의 라인은 겹치지 않습니다.") + public void testRandomGenerate() { RandomLadderGenerator generator = new RandomLadderGenerator(); var ladder = generator.generate(5, 5); for (var row : ladder.getLadder()) { for (int i = 1 ; i < row.size()-1 ; i++) { + // 현재위치와 앞 또는 뒤 위치에 라인이 모두 있는 경우는 없습니다. assertFalse(row.get(i) && row.get(i-1)); assertFalse(row.get(i) && row.get(i+1)); } From 221340f263f9e64c57b19e95368ab3b7a09133eb Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 16 Mar 2023 14:15:29 +0900 Subject: [PATCH 18/24] =?UTF-8?q?refactor:=20Ladder=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사다리의 행을 나타내는 객체 Line을 만들었습니다. - Line은 다리 유무를 나타내는 점들의 리스트 points를 가집니다. - 한 점(i)에서 다리 유무를 반환하는 메소드 hasBridge(int i)와 점들의 개수를 반환하는 size()메소드를 가집니다. --- src/main/java/kr/codesquad/Ladder.java | 39 +++++++++++++------------- src/main/java/kr/codesquad/Line.java | 19 +++++++++++++ 2 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 src/main/java/kr/codesquad/Line.java diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/Ladder.java index ceff86f9..bf585066 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/Ladder.java @@ -3,28 +3,27 @@ import java.util.ArrayList; public class Ladder { - private final ArrayList> ladder; + private ArrayList ladder; - public Ladder(ArrayList> ladder) { - this.ladder = ladder; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (ArrayList row : ladder) { - sb.append(" "); // 사람 이름 5글자가 기준이므로 사다리 앞에 2칸의 간격 추가 - for (boolean hasLine : row) { - String line = hasLine ? "|-----" : "| "; - sb.append(line); - } - sb.append("\n"); + public Ladder(ArrayList ladder) { + this.ladder = ladder; } - return String.valueOf(sb); - } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (var line : ladder) { + sb.append(" "); // 사람 이름 5글자가 기준이므로 사다리 앞에 2칸의 간격 추가 + for (int i = 0; i < line.size(); i++) { + sb.append(line.hasBridge(i) ? "|-----" : "| "); + } + sb.append("\n"); + } + + return String.valueOf(sb); + } - public ArrayList> getLadder() { - return ladder; - } + public ArrayList getLadder() { + return ladder; + } } diff --git a/src/main/java/kr/codesquad/Line.java b/src/main/java/kr/codesquad/Line.java new file mode 100644 index 00000000..2f190986 --- /dev/null +++ b/src/main/java/kr/codesquad/Line.java @@ -0,0 +1,19 @@ +package kr.codesquad; + +import java.util.ArrayList; + +public class Line { + private ArrayList points = new ArrayList<>(); + + public boolean hasBridge(int i) { + return points.get(i); + } + + public int size() { + return points.size(); + } + + public void add(boolean point) { + points.add(point); + } +} From 98ab8454734baee8435c0119ddad09295b5a83d9 Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 16 Mar 2023 14:30:23 +0900 Subject: [PATCH 19/24] =?UTF-8?q?refactor:=20RandomLadderGenerator=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=99=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8E=99?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사다리의 행을 나타내는 객체 Line을 생성하여 사다리를 생성하도록 수정하였습니다. 테스트 클래스에서 SoftAssertion을 사용하여 테스트를 진행합니다. - 테스트에서 실패하는 케이스가 나와도 이후의 테스트를 모두 진행한 후 결과를 출력합니다. --- .../kr/codesquad/RandomLadderGenerator.java | 28 +++++------ .../codesquad/RandomLadderGeneratorTest.java | 46 ++++++++++--------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/main/java/kr/codesquad/RandomLadderGenerator.java b/src/main/java/kr/codesquad/RandomLadderGenerator.java index d8fba777..a7f6aecb 100644 --- a/src/main/java/kr/codesquad/RandomLadderGenerator.java +++ b/src/main/java/kr/codesquad/RandomLadderGenerator.java @@ -4,20 +4,20 @@ import java.util.Random; public class RandomLadderGenerator { - private final Random random = new Random(); + private final Random random = new Random(); - public Ladder generate(int sizeOfPeople, int sizeOfLadder) { - ArrayList> ladder = new ArrayList<>(sizeOfLadder); - for (int row = 0; row < sizeOfLadder; row++) { - ladder.add(new ArrayList<>()); - ladder.get(row).add(random.nextBoolean()); - for (int col = 1; col < sizeOfPeople-1; col++) { - boolean hasLine = ladder.get(row).get(col-1) ? false : random.nextBoolean(); // 이전 열의 라인 유무확인 - ladder.get(row).add(hasLine); - } - ladder.get(row).add(false); // 마지막 열은 라인이 없으므로 false를 저장한다. + public Ladder generate(int sizeOfPeople, int sizeOfLadder) { + ArrayList ladder = new ArrayList<>(); + while (sizeOfLadder-- > 0) { + Line line = new Line(); + line.add(random.nextBoolean()); + for (int col = 1; col < sizeOfPeople - 1; col++) { + // 이전 열의 라인 유무확인 + line.add(line.hasBridge(col - 1) ? false : random.nextBoolean()); + } + line.add(false); // 마지막 열은 라인이 없으므로 false를 저장한다. + ladder.add(line); + } + return new Ladder(ladder); } - - return new Ladder(ladder); - } } diff --git a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java index 9fca8789..89395aae 100644 --- a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java +++ b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java @@ -1,32 +1,36 @@ package kr.codesquad; +import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; class RandomLadderGeneratorTest { - @Test - @DisplayName("랜덤하게 생성시 사다리의 라인은 겹치지 않습니다.") - public void testRandomGenerate() { - RandomLadderGenerator generator = new RandomLadderGenerator(); - var ladder = generator.generate(5, 5); - for (var row : ladder.getLadder()) { - for (int i = 1 ; i < row.size()-1 ; i++) { - // 현재위치와 앞 또는 뒤 위치에 라인이 모두 있는 경우는 없습니다. - assertFalse(row.get(i) && row.get(i-1)); - assertFalse(row.get(i) && row.get(i+1)); - } + @Test + @DisplayName("랜덤하게 생성시 사다리의 라인은 겹치지 않습니다.") + public void testRandomGenerate() { + RandomLadderGenerator generator = new RandomLadderGenerator(); + var ladder = generator.generate(5, 5); + + SoftAssertions softAssertions = new SoftAssertions(); + for (Line line : ladder.getLadder()) { + for (int i = 1; i < line.size() - 1; i++) { + // 현재위치와 앞 또는 뒤 위치에 라인이 모두 있는 경우는 없습니다. + softAssertions.assertThat(line.hasBridge(i)).isTrue() + .isNotEqualTo(line.hasBridge(i - 1)) + .isNotEqualTo(line.hasBridge(i + 1)); + } + } } - } - @Test - @DisplayName("사다리의 마지막 열은 라인이 없습니다.") - public void testLastRow() { - RandomLadderGenerator generator = new RandomLadderGenerator(); - var ladder = generator.generate(5, 5); - for (var row : ladder.getLadder()) { - assertFalse(row.get(4)); + @Test + @DisplayName("사다리의 마지막 열은 라인이 없습니다.") + public void testLastRow() { + RandomLadderGenerator generator = new RandomLadderGenerator(); + var ladder = generator.generate(5, 5); + for (Line line : ladder.getLadder()) { + assertFalse(line.hasBridge(4)); + } } - } } \ No newline at end of file From 4dd241c6e946b006360d5d29b28a88409353e442 Mon Sep 17 00:00:00 2001 From: LaStella Date: Thu, 16 Mar 2023 14:31:12 +0900 Subject: [PATCH 20/24] =?UTF-8?q?fix:=20isValidPlayer=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LadderGame 클래스의 isValidPlayer메소드에서 잘못된 조건식을 수정하였습니다. --- src/main/java/kr/codesquad/LadderGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/LadderGame.java index 219150d1..1f898382 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/LadderGame.java @@ -66,7 +66,7 @@ private Optional> parsePlayerList(String inputString) { private boolean isValidPlayer(String[] playerNames) { if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 - return Arrays.stream(playerNames).allMatch(name -> name.length() > MAX_NAME_SIZE); + return Arrays.stream(playerNames).allMatch(name -> name.length() < MAX_NAME_SIZE); } private Optional parseLadderSize(String inputString) { From 6e8868271e903d03021efe416224859499d08205 Mon Sep 17 00:00:00 2001 From: LaStella Date: Fri, 17 Mar 2023 10:05:09 +0900 Subject: [PATCH 21/24] =?UTF-8?q?chore:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=B3=84=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 UI 관련 클래스는 view 패키지로 분류하였습니다. 그 외 비즈니스 로직을 담당하는 클래스는 domain으로 분류하였습니다. --- src/main/java/kr/codesquad/Main.java | 4 ++++ src/main/java/kr/codesquad/{ => domain}/Ladder.java | 2 +- src/main/java/kr/codesquad/{ => domain}/LadderGame.java | 4 +++- src/main/java/kr/codesquad/{ => domain}/Line.java | 2 +- src/main/java/kr/codesquad/{ => domain}/Player.java | 2 +- .../java/kr/codesquad/{ => domain}/RandomLadderGenerator.java | 2 +- src/main/java/kr/codesquad/{ => view}/Console.java | 2 +- src/test/java/kr/codesquad/RandomLadderGeneratorTest.java | 2 ++ 8 files changed, 14 insertions(+), 6 deletions(-) rename src/main/java/kr/codesquad/{ => domain}/Ladder.java (96%) rename src/main/java/kr/codesquad/{ => domain}/LadderGame.java (97%) rename src/main/java/kr/codesquad/{ => domain}/Line.java (91%) rename src/main/java/kr/codesquad/{ => domain}/Player.java (93%) rename src/main/java/kr/codesquad/{ => domain}/RandomLadderGenerator.java (96%) rename src/main/java/kr/codesquad/{ => view}/Console.java (94%) diff --git a/src/main/java/kr/codesquad/Main.java b/src/main/java/kr/codesquad/Main.java index f28c4b07..1d627f89 100644 --- a/src/main/java/kr/codesquad/Main.java +++ b/src/main/java/kr/codesquad/Main.java @@ -1,5 +1,9 @@ package kr.codesquad; +import kr.codesquad.domain.LadderGame; +import kr.codesquad.domain.RandomLadderGenerator; +import kr.codesquad.view.Console; + public class Main { public static void main(String[] args) { Console console = new Console(); diff --git a/src/main/java/kr/codesquad/Ladder.java b/src/main/java/kr/codesquad/domain/Ladder.java similarity index 96% rename from src/main/java/kr/codesquad/Ladder.java rename to src/main/java/kr/codesquad/domain/Ladder.java index bf585066..3f831034 100644 --- a/src/main/java/kr/codesquad/Ladder.java +++ b/src/main/java/kr/codesquad/domain/Ladder.java @@ -1,4 +1,4 @@ -package kr.codesquad; +package kr.codesquad.domain; import java.util.ArrayList; diff --git a/src/main/java/kr/codesquad/LadderGame.java b/src/main/java/kr/codesquad/domain/LadderGame.java similarity index 97% rename from src/main/java/kr/codesquad/LadderGame.java rename to src/main/java/kr/codesquad/domain/LadderGame.java index 1f898382..89e3deb2 100644 --- a/src/main/java/kr/codesquad/LadderGame.java +++ b/src/main/java/kr/codesquad/domain/LadderGame.java @@ -1,4 +1,6 @@ -package kr.codesquad; +package kr.codesquad.domain; + +import kr.codesquad.view.Console; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/kr/codesquad/Line.java b/src/main/java/kr/codesquad/domain/Line.java similarity index 91% rename from src/main/java/kr/codesquad/Line.java rename to src/main/java/kr/codesquad/domain/Line.java index 2f190986..3f225e1c 100644 --- a/src/main/java/kr/codesquad/Line.java +++ b/src/main/java/kr/codesquad/domain/Line.java @@ -1,4 +1,4 @@ -package kr.codesquad; +package kr.codesquad.domain; import java.util.ArrayList; diff --git a/src/main/java/kr/codesquad/Player.java b/src/main/java/kr/codesquad/domain/Player.java similarity index 93% rename from src/main/java/kr/codesquad/Player.java rename to src/main/java/kr/codesquad/domain/Player.java index 39a426c0..d5b114a3 100644 --- a/src/main/java/kr/codesquad/Player.java +++ b/src/main/java/kr/codesquad/domain/Player.java @@ -1,4 +1,4 @@ -package kr.codesquad; +package kr.codesquad.domain; public class Player { private final String name; diff --git a/src/main/java/kr/codesquad/RandomLadderGenerator.java b/src/main/java/kr/codesquad/domain/RandomLadderGenerator.java similarity index 96% rename from src/main/java/kr/codesquad/RandomLadderGenerator.java rename to src/main/java/kr/codesquad/domain/RandomLadderGenerator.java index a7f6aecb..ec187754 100644 --- a/src/main/java/kr/codesquad/RandomLadderGenerator.java +++ b/src/main/java/kr/codesquad/domain/RandomLadderGenerator.java @@ -1,4 +1,4 @@ -package kr.codesquad; +package kr.codesquad.domain; import java.util.ArrayList; import java.util.Random; diff --git a/src/main/java/kr/codesquad/Console.java b/src/main/java/kr/codesquad/view/Console.java similarity index 94% rename from src/main/java/kr/codesquad/Console.java rename to src/main/java/kr/codesquad/view/Console.java index 17541bd3..6fe5f800 100644 --- a/src/main/java/kr/codesquad/Console.java +++ b/src/main/java/kr/codesquad/view/Console.java @@ -1,4 +1,4 @@ -package kr.codesquad; +package kr.codesquad.view; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java index 89395aae..e8e86838 100644 --- a/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java +++ b/src/test/java/kr/codesquad/RandomLadderGeneratorTest.java @@ -1,5 +1,7 @@ package kr.codesquad; +import kr.codesquad.domain.Line; +import kr.codesquad.domain.RandomLadderGenerator; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From f6788405d884110daa791ca15f061951433584a0 Mon Sep 17 00:00:00 2001 From: LaStella Date: Fri, 17 Mar 2023 10:12:43 +0900 Subject: [PATCH 22/24] =?UTF-8?q?refactor:=20Console=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit try-catch에서 재귀호출로 입력을 다시 받지 않게 수정하였습니다. Optional을 사용하여 IOException이 발생하면 비어있는 객체가 반환됩니다. 들여쓰기를 2칸 -> 4칸으로 수정하였습니다. --- src/main/java/kr/codesquad/view/Console.java | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/kr/codesquad/view/Console.java b/src/main/java/kr/codesquad/view/Console.java index 6fe5f800..9afee241 100644 --- a/src/main/java/kr/codesquad/view/Console.java +++ b/src/main/java/kr/codesquad/view/Console.java @@ -6,18 +6,18 @@ import java.util.Optional; public class Console { - private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - public String input(String prompt) { - System.out.println(prompt); - try { - return br.readLine(); - } catch (IOException e) { - return input(prompt); + public Optional input(String prompt) { + System.out.println(prompt); + try { + return Optional.of(br.readLine()); + } catch (IOException e) { + return Optional.empty(); + } } - } - public void inputError() { - System.out.println("입력이 잘못되었습니다."); - } + public void inputError() { + System.out.println("입력이 잘못되었습니다."); + } } From c2cd0d4fbb64acc1a0317581cdd1575d2896b8e1 Mon Sep 17 00:00:00 2001 From: LaStella Date: Fri, 17 Mar 2023 10:17:33 +0900 Subject: [PATCH 23/24] =?UTF-8?q?refacotr:=20LadderGame=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사람 이름 입력과 사다리 높이 입력에서 잘못된 입력시 재귀호출로 재입력 받지 않도록 수정하였습니다. 사람 이름 입력과 사다리 높이 입력을 while문을 사용하여 올바른 입력을 받을 때까지 반복합니다. 잘못된 입력은 Optional을 사용하여 비어있는 객체를 반환합니다. --- .../java/kr/codesquad/domain/LadderGame.java | 160 +++++++++--------- 1 file changed, 84 insertions(+), 76 deletions(-) diff --git a/src/main/java/kr/codesquad/domain/LadderGame.java b/src/main/java/kr/codesquad/domain/LadderGame.java index 89e3deb2..ec43b3cd 100644 --- a/src/main/java/kr/codesquad/domain/LadderGame.java +++ b/src/main/java/kr/codesquad/domain/LadderGame.java @@ -7,87 +7,95 @@ import java.util.Optional; public class LadderGame implements Runnable { - private final int MIN_SIZE_OF_PEOPLE = 2; - private final int MIN_SIZE_OF_LADDER = 1; - private final int MAX_NAME_SIZE = 5; - private final Console console; - private final RandomLadderGenerator generator; - - public LadderGame(Console console, RandomLadderGenerator generator) { - this.console = console; - this.generator = generator; - } - - @Override - public void run() { - ArrayList playerArrayList = inputPlayersToPlayerList("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); - int sizeOfLadder = inputToLadderSize("최대 사다리 높이는 몇 개인가요?"); - - Ladder ladder = generator.generate(playerArrayList.size(),sizeOfLadder); - printPlayerList(playerArrayList); // 사람 이름 출력 - System.out.println(ladder); // 사다리 출력 - } - - private void printPlayerList(ArrayList playerArrayList) { - StringBuilder sb = new StringBuilder(); - for (var player : playerArrayList) { - sb.append(alignCenter(player.getName())).append(" "); + private final int MIN_SIZE_OF_PEOPLE = 2; + private final int MIN_SIZE_OF_LADDER = 1; + private final int MAX_NAME_SIZE = 5; + private final Console console; + private final RandomLadderGenerator generator; + + public LadderGame(Console console, RandomLadderGenerator generator) { + this.console = console; + this.generator = generator; } - System.out.println(sb); - } - - // 5글자를 기준으로 이름을 가운데로 정렬하는 메소드 - private String alignCenter(String name) { - StringBuilder sb = new StringBuilder(); - while(sb.length() < (MAX_NAME_SIZE-name.length())/2) sb.append(" "); - sb.append(name); - while(sb.length() < MAX_NAME_SIZE) sb.append(" "); - return sb.toString(); - } - - private ArrayList inputPlayersToPlayerList(String prompt) { - String inputString = console.input(prompt); - Optional> parsedValue = parsePlayerList(inputString); - if (parsedValue.isEmpty()) { - console.inputError(); - return inputPlayersToPlayerList(prompt); + + @Override + public void run() { + ArrayList players; + int LadderSize; + + while (true) { + Optional> inputPlayers = inputNamesToPlayers(); + if (inputPlayers.isPresent()) { + players = inputPlayers.get(); + break; + } + } + + while (true) { + Optional inputLadderSize = inputNumberToLadderSize(); + if (inputLadderSize.isPresent()) { + LadderSize = inputLadderSize.get(); + break; + } + } + + Ladder ladder = generator.generate(players.size(), LadderSize); + printPlayerList(players); // 사람 이름 출력 + System.out.println(ladder); // 사다리 출력 } - return parsedValue.get(); - } - private Optional> parsePlayerList(String inputString) { - String[] playerNames = inputString.split(","); - if (!isValidPlayer(playerNames)) return Optional.empty(); + private void printPlayerList(ArrayList playerArrayList) { + StringBuilder sb = new StringBuilder(); + for (var player : playerArrayList) { + sb.append(alignCenter(player.getName())).append(" "); + } + System.out.println(sb); + } - ArrayList result = new ArrayList<>(); - for (int i = 0; i < playerNames.length; i++) { - result.add(new Player(playerNames[i], i)); + // 5글자를 기준으로 이름을 가운데로 정렬하는 메소드 + private String alignCenter(String name) { + StringBuilder sb = new StringBuilder(); + while (sb.length() < (MAX_NAME_SIZE - name.length()) / 2) sb.append(" "); + sb.append(name); + while (sb.length() < MAX_NAME_SIZE) sb.append(" "); + return sb.toString(); } - return Optional.of(result); - } - - private boolean isValidPlayer(String[] playerNames) { - if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 - return Arrays.stream(playerNames).allMatch(name -> name.length() < MAX_NAME_SIZE); - } - - private Optional parseLadderSize(String inputString) { - try { - int result = Integer.parseInt(inputString); - if (result < MIN_SIZE_OF_LADDER) return Optional.empty(); - return Optional.of(result); - } catch (NumberFormatException e) { - return Optional.empty(); + + private Optional> inputNamesToPlayers() { + var input = console.input("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + if (input.isEmpty()) return Optional.empty(); + return parsePlayerList(input.get()); } - } - - private int inputToLadderSize(String prompt) { - String inputString = console.input(prompt); - Optional parsedValue = parseLadderSize(inputString); - if (parsedValue.isEmpty()) { - console.inputError(); - return inputToLadderSize(prompt); + + private Optional> parsePlayerList(String inputString) { + String[] playerNames = inputString.split(","); + if (!isValidPlayer(playerNames)) return Optional.empty(); + + ArrayList result = new ArrayList<>(); + for (int i = 0; i < playerNames.length; i++) { + result.add(new Player(playerNames[i], i)); + } + return Optional.of(result); + } + + private boolean isValidPlayer(String[] playerNames) { + if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인 + return Arrays.stream(playerNames).allMatch(name -> name.length() < MAX_NAME_SIZE); + } + + private Optional parseLadderSize(String inputString) { + try { + int result = Integer.parseInt(inputString); + if (result < MIN_SIZE_OF_LADDER) return Optional.empty(); + return Optional.of(result); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + private Optional inputNumberToLadderSize() { + var input = console.input("최대 사다리 높이는 몇 개인가요?"); + if (input.isEmpty()) return Optional.empty(); + return parseLadderSize(input.get()); } - return parsedValue.get(); - } } From a0eb363926d7b10b2c29f731d8cd8bd30108c42d Mon Sep 17 00:00:00 2001 From: LaStella Date: Fri, 17 Mar 2023 10:34:31 +0900 Subject: [PATCH 24/24] =?UTF-8?q?refacotr:=20LadderGame=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사람 이름 입력과 사다리 높이 입력을 while로 재입력 받지 않습니다. 입력값을 players와 ladderSize로 변환하는 메소드에서 재귀호출하여 재입력받습니다. 잘못적은 변수명(LadderSize -> ladderSize)을 수정하였습니다. --- .../java/kr/codesquad/domain/LadderGame.java | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/kr/codesquad/domain/LadderGame.java b/src/main/java/kr/codesquad/domain/LadderGame.java index ec43b3cd..2526123e 100644 --- a/src/main/java/kr/codesquad/domain/LadderGame.java +++ b/src/main/java/kr/codesquad/domain/LadderGame.java @@ -20,26 +20,10 @@ public LadderGame(Console console, RandomLadderGenerator generator) { @Override public void run() { - ArrayList players; - int LadderSize; + ArrayList players = inputNamesToPlayers(); + int ladderSize = inputNumberToLadderSize(); - while (true) { - Optional> inputPlayers = inputNamesToPlayers(); - if (inputPlayers.isPresent()) { - players = inputPlayers.get(); - break; - } - } - - while (true) { - Optional inputLadderSize = inputNumberToLadderSize(); - if (inputLadderSize.isPresent()) { - LadderSize = inputLadderSize.get(); - break; - } - } - - Ladder ladder = generator.generate(players.size(), LadderSize); + Ladder ladder = generator.generate(players.size(), ladderSize); printPlayerList(players); // 사람 이름 출력 System.out.println(ladder); // 사다리 출력 } @@ -61,10 +45,11 @@ private String alignCenter(String name) { return sb.toString(); } - private Optional> inputNamesToPlayers() { + private ArrayList inputNamesToPlayers() { var input = console.input("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); - if (input.isEmpty()) return Optional.empty(); - return parsePlayerList(input.get()); + if (input.isEmpty()) return inputNamesToPlayers(); + var parsedValue = parsePlayerList(input.get()); + return parsedValue.orElseGet(this::inputNamesToPlayers); } private Optional> parsePlayerList(String inputString) { @@ -93,9 +78,10 @@ private Optional parseLadderSize(String inputString) { } } - private Optional inputNumberToLadderSize() { + private int inputNumberToLadderSize() { var input = console.input("최대 사다리 높이는 몇 개인가요?"); - if (input.isEmpty()) return Optional.empty(); - return parseLadderSize(input.get()); + if (input.isEmpty()) return inputNumberToLadderSize(); + var parsedValue = parseLadderSize(input.get()); + return parsedValue.orElseGet(this::inputNumberToLadderSize); } }