From 4588e68233d0bcfaa561262facc12e72ccd8a754 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 20:06:41 +0900 Subject: [PATCH 01/40] =?UTF-8?q?chore:=20=EC=86=8C=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets_mate/LeetsMateApplication.java | 36 +--------------- .../leets_mate/LeetsMateApplicationTests.java | 43 ------------------- 2 files changed, 1 insertion(+), 78 deletions(-) diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index e48ce2b..bfa6bf2 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -1,42 +1,8 @@ package leets.leets_mate; -import java.util.*; - public class LeetsMateApplication { - // 동작 함수입니다. - public void run() { - } - - // 문자열로된 멤버들을 리스트로 분리하는 함수입니다. - public List parseMembers(String members) { - return new ArrayList<>(); - } - - // 총 멤버수를 반환합니다. - public int memberNumber(List members) { - return 0; - } - - // 멤버 문자열에 영어가 있는지 검사합니다. 영어가 있다면 예외 출력 - public void checkHasNoEnglish(String members) { - } - - // 멤버수와 최대 짝수 데이터가 유효한지 검사하는 함수입니다. 유효하지 않다면 예외 출력 - public void checkDataValidity(int memberCount, int maximumGroupSize) { - } - - // 랜덤 짝꿍 추첨하는 함수 입니다. - public List> generateRandomGroups(List memberList, int maximumGroupSize) { - return new ArrayList<>(); - } - - // 결과를 프린트 하는 함수입니다. - public void printResult(List> result) { - } - public static void main(String[] args) { - LeetsMateApplication app = new LeetsMateApplication(); - app.run(); + } } \ No newline at end of file diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 706e295..d359a28 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -1,47 +1,4 @@ package leets.leets_mate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - class LeetsMateApplicationTests { - LeetsMateApplication app; - - @BeforeEach - void setUp() { - app = new LeetsMateApplication(); - } - - @Test - void 입력받은_문자열을_파싱하여_리스트로_만든다() { - String members = "리츠에,오신,걸,환영합니다"; - List actual = app.parseMembers(members); - assertThat(actual).containsExactly("리츠에", "오신", "걸", "환영합니다"); - } - - @Test - void 멤버수를_반환한다() { - List members = Arrays.asList("리츠에", "오신", "걸", "환영합니다"); - int actual = app.memberNumber(members); - assertThat(actual).isEqualTo(4); - } - - @Test - void 멤버수와_최대_멤버수를_잘못_입력한_경우_예외를_반환한다() { - assertThrows(Exception.class, () -> { - app.checkDataValidity(3, 4); - }); - } - - @Test - void 멤버_문자열에_영어를_입력한_경우_예외를_반환한다() { - assertThrows(Exception.class, () -> { - app.checkHasNoEnglish("welcome,to,leets"); - }); - } } \ No newline at end of file From 679aa400a456a6654d00da0c774ed60046d98797 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 20:07:02 +0900 Subject: [PATCH 02/40] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..3205e55 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,30 @@ +## 📑 기능 요구 사항 + +**입력** + +- [ ] 참석자들의 이름을 입력 받는다 + - [ ] `,` 로 구분한다. + - [ ] 한글이 아니라면 예외가 발생한다. +- [ ] 최대 짝(그룹) 인원 수를 입력 받는다. + - [ ] 숫자가 아니라면 예외가 발생한다. + - [ ] 이름 수 < 최대 짝(그룹) 인원 수인 경우 예외가 발생한다. +- [ ] 재추천 여부를 입력 받는다. + - [ ] `y` 또는 `n` 가 아니라면 예외가 발생한다. + +**출력** + +- [ ] 짝 추천 결과를 출력한다 + - [ ] `[ 이름1 | ... | 이름2 ]` 형식으로 출력한다. +- [ ] 예외는 `[ERROR]`와 메시지를 함께 출력한다. + +**사람** + +- [ ] 이름은 5글자 이내이다. + +**짝** + +- [ ] 최대 짝 수는 사람 수보다 작거나 같아야 한다. + +**매칭** + +- [ ] 랜덤으로 매칭한다. \ No newline at end of file From fab7a8e1d0000f3d377d6007bb40b3fb6ace8966 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 20:32:48 +0900 Subject: [PATCH 03/40] =?UTF-8?q?feat(Name):=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/Name.java | 19 +++++++++++++++++++ src/test/java/leets/leets_mate/NameTest.java | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/leets/leets_mate/Name.java create mode 100644 src/test/java/leets/leets_mate/NameTest.java diff --git a/src/main/java/leets/leets_mate/Name.java b/src/main/java/leets/leets_mate/Name.java new file mode 100644 index 0000000..3090f7e --- /dev/null +++ b/src/main/java/leets/leets_mate/Name.java @@ -0,0 +1,19 @@ +package leets.leets_mate; + +public class Name { + + private static final int MAX_LENGTH = 5; + + private final String name; + + public Name(String name) { + validate(name); + this.name = name; + } + + private void validate(String name) { + if (name.length() > MAX_LENGTH) { + throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); + } + } +} diff --git a/src/test/java/leets/leets_mate/NameTest.java b/src/test/java/leets/leets_mate/NameTest.java new file mode 100644 index 0000000..1d7709e --- /dev/null +++ b/src/test/java/leets/leets_mate/NameTest.java @@ -0,0 +1,16 @@ +package leets.leets_mate; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class NameTest { + + @Test + @DisplayName("이름의 길이가 6글자 이상이라면 예외가 발생한다.") + void name_InvalidLength_ExceptionThrown() { + assertThatIllegalArgumentException() + .isThrownBy(() -> new Name("나아연이라능")); + } +} From 09ffa9e6c9ce899990a8c1d35ea2fab249fed60b Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 20:33:57 +0900 Subject: [PATCH 04/40] =?UTF-8?q?refactor(Name):=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/{ => domain}/Name.java | 2 +- src/test/java/leets/leets_mate/{ => domain}/NameTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/leets/leets_mate/{ => domain}/Name.java (91%) rename src/test/java/leets/leets_mate/{ => domain}/NameTest.java (93%) diff --git a/src/main/java/leets/leets_mate/Name.java b/src/main/java/leets/leets_mate/domain/Name.java similarity index 91% rename from src/main/java/leets/leets_mate/Name.java rename to src/main/java/leets/leets_mate/domain/Name.java index 3090f7e..9677683 100644 --- a/src/main/java/leets/leets_mate/Name.java +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -1,4 +1,4 @@ -package leets.leets_mate; +package leets.leets_mate.domain; public class Name { diff --git a/src/test/java/leets/leets_mate/NameTest.java b/src/test/java/leets/leets_mate/domain/NameTest.java similarity index 93% rename from src/test/java/leets/leets_mate/NameTest.java rename to src/test/java/leets/leets_mate/domain/NameTest.java index 1d7709e..590e1a3 100644 --- a/src/test/java/leets/leets_mate/NameTest.java +++ b/src/test/java/leets/leets_mate/domain/NameTest.java @@ -1,4 +1,4 @@ -package leets.leets_mate; +package leets.leets_mate.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From c8ed3a54d5c5408dc6f87c67e216698cfc8255e6 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 20:42:23 +0900 Subject: [PATCH 05/40] =?UTF-8?q?feat(Names):=20=EC=82=AC=EB=9E=8C=20?= =?UTF-8?q?=EC=88=98=20=EB=B0=98=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/Names.java | 16 +++++++++++++ .../leets/leets_mate/domain/NamesTest.java | 24 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/leets/leets_mate/domain/Names.java create mode 100644 src/test/java/leets/leets_mate/domain/NamesTest.java diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java new file mode 100644 index 0000000..dfb94c4 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -0,0 +1,16 @@ +package leets.leets_mate.domain; + +import java.util.List; + +public class Names { + + private final List names; + + public Names(List names) { + this.names = names; + } + + public int countNames() { + return names.size(); + } +} diff --git a/src/test/java/leets/leets_mate/domain/NamesTest.java b/src/test/java/leets/leets_mate/domain/NamesTest.java new file mode 100644 index 0000000..39b5e37 --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/NamesTest.java @@ -0,0 +1,24 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class NamesTest { + + @Test + @DisplayName("이름 수를 반환한다.") + void countNames() { + Names names = new Names(List.of( + new Name("아연"), + new Name("나아연"), + new Name("나나아연"), + new Name("나나나아연") + )); + + assertThat(names.countNames()).isEqualTo(4); + } +} \ No newline at end of file From f9dd968335b57bf1152e33b080a48add295207f9 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 21:19:24 +0900 Subject: [PATCH 06/40] =?UTF-8?q?feat(RandomNumbersGenerator):=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EB=B2=94=EC=9C=84=EC=97=90=EC=84=9C=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EA=B0=9C=EC=88=98=20=EC=88=AB=EC=9E=90=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/RandomNumbersGenerator.java | 17 ++++++++++++++ .../domain/RandomNumbersGeneratorTest.java | 23 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java create mode 100644 src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java new file mode 100644 index 0000000..cae3083 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java @@ -0,0 +1,17 @@ +package leets.leets_mate.domain; + +import java.util.List; +import java.util.Random; + +public class RandomNumbersGenerator { + + private final Random random = new Random(); + + public List randomNumbers(int pairCount, int bound) { + return random.ints(0, bound) + .distinct() + .limit(pairCount) + .boxed() + .toList(); + } +} diff --git a/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java b/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java new file mode 100644 index 0000000..09b2777 --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java @@ -0,0 +1,23 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class RandomNumbersGeneratorTest { + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3, 4}) + @DisplayName("범위 내에서 지정 짝 수 크기와 같은 개수의 숫자들을 반환한다.") + void randomNumbers(int pairCount) { + RandomNumbersGenerator randomNumbersGenerator = new RandomNumbersGenerator(); + + List randomNumbers = randomNumbersGenerator.randomNumbers(pairCount, 5); + + assertThat(randomNumbers).hasSize(pairCount); + } +} From 2876215ed48721875259f21abc35789bf9d5a653 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 6 Apr 2024 23:32:44 +0900 Subject: [PATCH 07/40] =?UTF-8?q?fix(RandomNumbersGenerator):=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=20=EB=82=B4=20=EC=88=AB=EC=9E=90=20=EB=9E=9C=EB=8D=A4?= =?UTF-8?q?=20=EC=88=9C=EC=84=9C=EB=A1=9C=20=EB=B0=98=ED=99=98=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/RandomNumbersGenerator.java | 16 ++++++++-------- .../domain/RandomNumbersGeneratorTest.java | 14 ++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java index cae3083..13b9b6a 100644 --- a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java +++ b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java @@ -1,17 +1,17 @@ package leets.leets_mate.domain; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Random; +import java.util.stream.IntStream; public class RandomNumbersGenerator { - private final Random random = new Random(); - - public List randomNumbers(int pairCount, int bound) { - return random.ints(0, bound) - .distinct() - .limit(pairCount) + public List randomNumbers(int bound) { + List list = new ArrayList<>(IntStream.range(0, bound) .boxed() - .toList(); + .toList()); + Collections.shuffle(list); + return list; } } diff --git a/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java b/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java index 09b2777..fc87add 100644 --- a/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java +++ b/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java @@ -1,8 +1,7 @@ package leets.leets_mate.domain; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.api.Test; import java.util.List; @@ -10,14 +9,13 @@ class RandomNumbersGeneratorTest { - @ParameterizedTest - @ValueSource(ints = {1, 2, 3, 4}) - @DisplayName("범위 내에서 지정 짝 수 크기와 같은 개수의 숫자들을 반환한다.") - void randomNumbers(int pairCount) { + @Test + @DisplayName("범위 내 숫자를 랜덤 순서로 반환한다.") + void randomNumbers_pairCount_hasEqualSize() { RandomNumbersGenerator randomNumbersGenerator = new RandomNumbersGenerator(); - List randomNumbers = randomNumbersGenerator.randomNumbers(pairCount, 5); + List randomNumbers = randomNumbersGenerator.randomNumbers(10); - assertThat(randomNumbers).hasSize(pairCount); + assertThat(randomNumbers).containsOnly(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); } } From 18cca4abbb9e2885020ec092fd7ee17aee9f64e9 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 00:46:41 +0900 Subject: [PATCH 08/40] =?UTF-8?q?fix(RandomNumbersGenerator):=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=20=EB=82=B4=20=EC=88=AB=EC=9E=90=EB=A5=BC=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EC=88=9C=EC=84=9C=EC=99=80=20=EC=A3=BC=EC=96=B4?= =?UTF-8?q?=EC=A7=84=20=EC=82=AC=EC=9D=B4=EC=A6=88=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/RandomNumbersGenerator.java | 14 +++++++++---- .../domain/RandomNumbersGeneratorTest.java | 21 ------------------- 2 files changed, 10 insertions(+), 25 deletions(-) delete mode 100644 src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java index 13b9b6a..75981c9 100644 --- a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java +++ b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java @@ -7,11 +7,17 @@ public class RandomNumbersGenerator { - public List randomNumbers(int bound) { - List list = new ArrayList<>(IntStream.range(0, bound) + public List> randomNumbers(int bound, int size) { + List integers = new ArrayList<>(IntStream.range(0, bound) .boxed() .toList()); - Collections.shuffle(list); - return list; + Collections.shuffle(integers); + + List> randomIndexes = new ArrayList<>(); + for (int index = 0; index < bound; index += size) { + int end = Math.min(index + size, bound); + randomIndexes.add(integers.subList(index, end)); + } + return randomIndexes; } } diff --git a/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java b/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java deleted file mode 100644 index fc87add..0000000 --- a/src/test/java/leets/leets_mate/domain/RandomNumbersGeneratorTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package leets.leets_mate.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class RandomNumbersGeneratorTest { - - @Test - @DisplayName("범위 내 숫자를 랜덤 순서로 반환한다.") - void randomNumbers_pairCount_hasEqualSize() { - RandomNumbersGenerator randomNumbersGenerator = new RandomNumbersGenerator(); - - List randomNumbers = randomNumbersGenerator.randomNumbers(10); - - assertThat(randomNumbers).containsOnly(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); - } -} From f418c3e826a776193779981aebdceb1203c22119 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 00:50:15 +0900 Subject: [PATCH 09/40] =?UTF-8?q?fix(Names):=20=EC=9D=B8=EB=8D=B1=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/Name.java | 15 ++++++++++++ .../java/leets/leets_mate/domain/Names.java | 20 ++++++++++++++++ .../leets/leets_mate/domain/NamesTest.java | 23 ++++++++++++------- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/Name.java b/src/main/java/leets/leets_mate/domain/Name.java index 9677683..184b49b 100644 --- a/src/main/java/leets/leets_mate/domain/Name.java +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -1,5 +1,7 @@ package leets.leets_mate.domain; +import java.util.Objects; + public class Name { private static final int MAX_LENGTH = 5; @@ -16,4 +18,17 @@ private void validate(String name) { throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name = (Name) o; + return Objects.equals(this.name, name.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index dfb94c4..23d983c 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -1,6 +1,7 @@ package leets.leets_mate.domain; import java.util.List; +import java.util.Objects; public class Names { @@ -13,4 +14,23 @@ public Names(List names) { public int countNames() { return names.size(); } + + public List findByIndexes(List indexes) { + return indexes.stream() + .map(names::get) + .toList(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Names names = (Names) o; + return Objects.equals(this.names, names.names); + } + + @Override + public int hashCode() { + return Objects.hash(names); + } } diff --git a/src/test/java/leets/leets_mate/domain/NamesTest.java b/src/test/java/leets/leets_mate/domain/NamesTest.java index 39b5e37..ec8698e 100644 --- a/src/test/java/leets/leets_mate/domain/NamesTest.java +++ b/src/test/java/leets/leets_mate/domain/NamesTest.java @@ -9,16 +9,23 @@ class NamesTest { + private final Names names = new Names(List.of( + new Name("아연"), + new Name("나아연"), + new Name("나나아연"), + new Name("나나나아연") + )); + @Test @DisplayName("이름 수를 반환한다.") void countNames() { - Names names = new Names(List.of( - new Name("아연"), - new Name("나아연"), - new Name("나나아연"), - new Name("나나나아연") - )); - assertThat(names.countNames()).isEqualTo(4); } -} \ No newline at end of file + + @Test + void findByIndexes() { + List namesByIndexes = names.findByIndexes(List.of(1, 3)); + + assertThat(namesByIndexes).containsOnly(new Name("나아연"), new Name("나나나아연")); + } +} From 98f15687acddc37271932db6d52bc1497a974ea4 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 00:51:54 +0900 Subject: [PATCH 10/40] =?UTF-8?q?feat(PairMatcher):=20=EC=A7=9D=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/Pair.java | 26 +++++++ .../leets/leets_mate/domain/PairMatcher.java | 27 ++++++++ .../leets_mate/domain/PairMatcherTest.java | 67 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/main/java/leets/leets_mate/domain/Pair.java create mode 100644 src/main/java/leets/leets_mate/domain/PairMatcher.java create mode 100644 src/test/java/leets/leets_mate/domain/PairMatcherTest.java diff --git a/src/main/java/leets/leets_mate/domain/Pair.java b/src/main/java/leets/leets_mate/domain/Pair.java new file mode 100644 index 0000000..6e5d5ca --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/Pair.java @@ -0,0 +1,26 @@ +package leets.leets_mate.domain; + +import java.util.List; +import java.util.Objects; + +public class Pair { + + private final Names names; + + public Pair(List names) { + this.names = new Names(names); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair pair = (Pair) o; + return Objects.equals(names, pair.names); + } + + @Override + public int hashCode() { + return Objects.hash(names); + } +} diff --git a/src/main/java/leets/leets_mate/domain/PairMatcher.java b/src/main/java/leets/leets_mate/domain/PairMatcher.java new file mode 100644 index 0000000..26b29dd --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairMatcher.java @@ -0,0 +1,27 @@ +package leets.leets_mate.domain; + +import java.util.ArrayList; +import java.util.List; + +public class PairMatcher { + + private final int pairCount; + private final RandomNumbersGenerator randomNumbersGenerator; + + public PairMatcher(int pairCount, RandomNumbersGenerator randomNumbersGenerator) { + this.pairCount = pairCount; + this.randomNumbersGenerator = randomNumbersGenerator; + } + + public List match(Names names) { + List> randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames(), pairCount); + + List pairs = new ArrayList<>(); + for (List randomNumber : randomNumbers) { + List pairNames = names.findByIndexes(randomNumber); + Pair pair = new Pair(pairNames); + pairs.add(pair); + } + return pairs; + } +} diff --git a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java new file mode 100644 index 0000000..7dfda6d --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java @@ -0,0 +1,67 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class PairMatcherTest { + + private final Name name1 = new Name("아연"); + private final Name name2 = new Name("나아연"); + private final Name name3 = new Name("나나아연"); + private final Name name4 = new Name("나나나아연"); + private Names names; + + @BeforeEach + void setUp() { + + names = new Names( + List.of(name1, name2, name3, name4) + ); + } + + @Test + @DisplayName("나머지 없이 랜덤으로 짝을 매치한다.") + void pairMatcher_Multiple() { + PairMatcher pairMatcher = new PairMatcher(2, new RandomNumbersGenerator() { + @Override + public List> randomNumbers(int bound, int size) { + return List.of( + List.of(0, 3), + List.of(1, 2)); + } + }); + + List pairs = pairMatcher.match(names); + + assertThat(pairs).containsOnly( + new Pair(List.of(name1, name4)), + new Pair(List.of(name2, name3)) + ); + } + + @Test + @DisplayName("나머지가 있어도 랜덤으로 짝을 매치한다.") + void pairMatcher_overNamesCount_ExceptionThrown() { + PairMatcher pairMatcher = new PairMatcher(3, new RandomNumbersGenerator() { + @Override + public List> randomNumbers(int bound, int size) { + return List.of( + List.of(0, 3, 1), + List.of(2) + ); + } + }); + + List pairs = pairMatcher.match(names); + + assertThat(pairs).containsOnly( + new Pair(List.of(name1, name4, name2)), + new Pair(List.of(name3)) + ); + } +} From 623f8378c556deeeacff7b8558c7b972a0692259 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 00:53:38 +0900 Subject: [PATCH 11/40] =?UTF-8?q?feat(OutputView):=20=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/view/OutputView.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/leets/leets_mate/view/OutputView.java diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java new file mode 100644 index 0000000..3646074 --- /dev/null +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -0,0 +1,9 @@ +package leets.leets_mate.view; + +public class OutputView { + + public void printStartNotice() { + System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); + System.out.println(); + } +} From 7d612c980dc8bde4db792f850fb82b536fc11f2a Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 00:56:22 +0900 Subject: [PATCH 12/40] =?UTF-8?q?feat(InputView):=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/view/InputView.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/leets/leets_mate/view/InputView.java diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java new file mode 100644 index 0000000..4feb385 --- /dev/null +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -0,0 +1,28 @@ +package leets.leets_mate.view; + +import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; + +public class InputView { + + public static final String COMMA = ","; + public static final Pattern FORMAT = Pattern.compile("^[ㄱ-힇]*$"); + + private final Scanner scanner = new Scanner(System.in); + + public List readNames() { + String input = scanner.nextLine(); + List rawNames = List.of(input.split(COMMA, -1)); + for (String rawName : rawNames) { + validateInput(rawName); + } + return rawNames; + } + + private void validateInput(String rawName) { + if (!FORMAT.matcher(rawName).matches()) { + throw new IllegalArgumentException("한글만 입력해 주세요"); + } + } +} From b7a3a87f2279138350557c2d639e78e3a828b4f5 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 23:39:07 +0900 Subject: [PATCH 13/40] =?UTF-8?q?feat(InputView):=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EC=A7=9D=20=EC=88=98=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/view/InputView.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java index 4feb385..ccff2ca 100644 --- a/src/main/java/leets/leets_mate/view/InputView.java +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -12,12 +12,18 @@ public class InputView { private final Scanner scanner = new Scanner(System.in); public List readNames() { + System.out.println(); + System.out.println("멤버의 이름을 입력해 주세요. (, 로 구분)"); + String input = scanner.nextLine(); List rawNames = List.of(input.split(COMMA, -1)); - for (String rawName : rawNames) { - validateInput(rawName); + try { + rawNames.forEach(this::validateInput); + return rawNames; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readNames(); } - return rawNames; } private void validateInput(String rawName) { @@ -25,4 +31,16 @@ private void validateInput(String rawName) { throw new IllegalArgumentException("한글만 입력해 주세요"); } } + + public int readPairCount() { + System.out.println(); + System.out.println("최대 짝 수를 입력해 주세요."); + + String input = scanner.nextLine(); + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자를 입력해 주세요"); + } + } } From f7c1b780b1f72e5ac674d9f7302e766c1e673a31 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 23:52:12 +0900 Subject: [PATCH 14/40] =?UTF-8?q?feat(OutputView):=20=EC=A7=9D=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/domain/Name.java | 4 ++++ src/main/java/leets/leets_mate/domain/Names.java | 6 ++++++ src/main/java/leets/leets_mate/domain/Pair.java | 4 ++++ .../java/leets/leets_mate/view/OutputView.java | 16 ++++++++++++++++ 4 files changed, 30 insertions(+) diff --git a/src/main/java/leets/leets_mate/domain/Name.java b/src/main/java/leets/leets_mate/domain/Name.java index 184b49b..ccee82d 100644 --- a/src/main/java/leets/leets_mate/domain/Name.java +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -19,6 +19,10 @@ private void validate(String name) { } } + public String asString() { + return name; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index 23d983c..2c3e3ea 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -33,4 +33,10 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(names); } + + public List names() { + return names.stream() + .map(Name::asString) + .toList(); + } } diff --git a/src/main/java/leets/leets_mate/domain/Pair.java b/src/main/java/leets/leets_mate/domain/Pair.java index 6e5d5ca..776c1a7 100644 --- a/src/main/java/leets/leets_mate/domain/Pair.java +++ b/src/main/java/leets/leets_mate/domain/Pair.java @@ -11,6 +11,10 @@ public Pair(List names) { this.names = new Names(names); } + public List names() { + return names.names(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java index 3646074..0219716 100644 --- a/src/main/java/leets/leets_mate/view/OutputView.java +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -1,9 +1,25 @@ package leets.leets_mate.view; +import java.util.List; +import java.util.StringJoiner; + public class OutputView { public void printStartNotice() { System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); System.out.println(); } + + public void printPairMatchNotice() { + System.out.println(); + System.out.println("오늘의 짝 추천 결과입니다."); + } + + public void printPairMatchResult(List pairs) { + StringJoiner stringJoiner = new StringJoiner(" | ", "[ ", " ]"); + for (String pair : pairs) { + stringJoiner.add(pair); + } + System.out.println(stringJoiner); + } } From 6d8b33b0de5fe922f090477c4b5eaf5d646752c7 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 23:52:48 +0900 Subject: [PATCH 15/40] =?UTF-8?q?feat(Computer):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EB=B7=B0=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/leets_mate/controller/Computer.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/leets/leets_mate/controller/Computer.java diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java new file mode 100644 index 0000000..d9c7ede --- /dev/null +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -0,0 +1,37 @@ +package leets.leets_mate.controller; + +import leets.leets_mate.domain.*; +import leets.leets_mate.view.InputView; +import leets.leets_mate.view.OutputView; + +import java.util.List; + +public class Computer { + + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + + public void run() { + outputView.printStartNotice(); + Names names = readNames(); + int pairCount = readPairCount(); + + PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator()); + + List pairs = pairMatcher.match(names); + outputView.printPairMatchNotice(); + pairs.forEach(pair -> outputView.printPairMatchResult(pair.names())); + } + + private Names readNames() { + List rawNames = inputView.readNames(); + List names = rawNames.stream() + .map(Name::new) + .toList(); + return new Names(names); + } + + private int readPairCount() { + return inputView.readPairCount(); + } +} From 430f2c1a86e7998988accee01e2857ab4308f006 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 23:53:00 +0900 Subject: [PATCH 16/40] =?UTF-8?q?feat(Applications):=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/Application.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/leets/leets_mate/Application.java diff --git a/src/main/java/leets/leets_mate/Application.java b/src/main/java/leets/leets_mate/Application.java new file mode 100644 index 0000000..de2187e --- /dev/null +++ b/src/main/java/leets/leets_mate/Application.java @@ -0,0 +1,10 @@ +package leets.leets_mate; + +import leets.leets_mate.controller.Computer; + +public class Application { + public static void main(String[] args) { + Computer computer = new Computer(); + computer.run(); + } +} From 75d887053fa04034e7af5047193df4261e8fb6b7 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 7 Apr 2024 23:59:59 +0900 Subject: [PATCH 17/40] =?UTF-8?q?feat(InputView):=20=EC=A7=9D=20=EC=88=98?= =?UTF-8?q?=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/view/InputView.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java index ccff2ca..b7b614e 100644 --- a/src/main/java/leets/leets_mate/view/InputView.java +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -8,6 +8,7 @@ public class InputView { public static final String COMMA = ","; public static final Pattern FORMAT = Pattern.compile("^[ㄱ-힇]*$"); + public static final String ERROR_FORMAT = "[ERROR] %s"; private final Scanner scanner = new Scanner(System.in); @@ -28,7 +29,7 @@ public List readNames() { private void validateInput(String rawName) { if (!FORMAT.matcher(rawName).matches()) { - throw new IllegalArgumentException("한글만 입력해 주세요"); + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "한글만 입력해 주세요.")); } } @@ -37,10 +38,19 @@ public int readPairCount() { System.out.println("최대 짝 수를 입력해 주세요."); String input = scanner.nextLine(); + try { + return parseToInt(input); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readPairCount(); + } + } + + private int parseToInt(String input) { try { return Integer.parseInt(input); } catch (NumberFormatException e) { - throw new IllegalArgumentException("숫자를 입력해 주세요"); + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "숫자를 입력해 주세요.")); } } } From 7c585c0d928a5370ea020646c4fc2d35bceb2828 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 00:00:48 +0900 Subject: [PATCH 18/40] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3205e55..55a89fa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,23 +3,24 @@ **입력** - [ ] 참석자들의 이름을 입력 받는다 - - [ ] `,` 로 구분한다. - - [ ] 한글이 아니라면 예외가 발생한다. + - [x] `,` 로 구분한다. + - [x] 한글이 아니라면 예외가 발생한다. + - [ ] 이름은 중복될 수 없다. - [ ] 최대 짝(그룹) 인원 수를 입력 받는다. - - [ ] 숫자가 아니라면 예외가 발생한다. + - [x] 숫자가 아니라면 예외가 발생한다. - [ ] 이름 수 < 최대 짝(그룹) 인원 수인 경우 예외가 발생한다. - [ ] 재추천 여부를 입력 받는다. - [ ] `y` 또는 `n` 가 아니라면 예외가 발생한다. **출력** -- [ ] 짝 추천 결과를 출력한다 - - [ ] `[ 이름1 | ... | 이름2 ]` 형식으로 출력한다. -- [ ] 예외는 `[ERROR]`와 메시지를 함께 출력한다. +- [x] 짝 추천 결과를 출력한다 + - [x] `[ 이름1 | ... | 이름2 ]` 형식으로 출력한다. +- [x] 예외는 `[ERROR]`와 메시지를 함께 출력한다. **사람** -- [ ] 이름은 5글자 이내이다. +- [x] 이름은 5글자 이내이다. **짝** @@ -27,4 +28,4 @@ **매칭** -- [ ] 랜덤으로 매칭한다. \ No newline at end of file +- [x] 랜덤으로 매칭한다. \ No newline at end of file From 3d4d891e5093a1a24f1abe7644ceea06e9601cf2 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 00:20:51 +0900 Subject: [PATCH 19/40] =?UTF-8?q?feat(PairCountValidator):=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20=EC=A7=9D=20=EC=88=98=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/leets_mate/domain/PairCountValidator.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/leets/leets_mate/domain/PairCountValidator.java diff --git a/src/main/java/leets/leets_mate/domain/PairCountValidator.java b/src/main/java/leets/leets_mate/domain/PairCountValidator.java new file mode 100644 index 0000000..f20d0b5 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairCountValidator.java @@ -0,0 +1,13 @@ +package leets.leets_mate.domain; + +public class PairCountValidator { + + private static final int MIN_COUNT = 2; + private static final String ERROR_FORMAT = "[ERROR] 최대 짝 수는 %d 이상, 이름 수 이하여야 합니다."; + + public void validate(int maxCount, int namesCount) { + if (maxCount < MIN_COUNT || maxCount > namesCount) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_COUNT)); + } + } +} From f93b123cc32431c6ffad5b3ff3d363d2cfe4411f Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 00:22:10 +0900 Subject: [PATCH 20/40] =?UTF-8?q?feat(PairCount):=20=EC=A7=9D=20=EC=88=98?= =?UTF-8?q?=20=EC=9B=90=EC=8B=9C=EA=B0=92=20=ED=8F=AC=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/controller/Computer.java | 8 +++++--- .../java/leets/leets_mate/domain/PairCount.java | 14 ++++++++++++++ .../java/leets/leets_mate/domain/PairMatcher.java | 6 +++--- .../leets/leets_mate/domain/PairMatcherTest.java | 4 ++-- 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 src/main/java/leets/leets_mate/domain/PairCount.java diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java index d9c7ede..02e0012 100644 --- a/src/main/java/leets/leets_mate/controller/Computer.java +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -14,7 +14,7 @@ public class Computer { public void run() { outputView.printStartNotice(); Names names = readNames(); - int pairCount = readPairCount(); + PairCount pairCount = readPairCount(names.countNames()); PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator()); @@ -31,7 +31,9 @@ private Names readNames() { return new Names(names); } - private int readPairCount() { - return inputView.readPairCount(); + private PairCount readPairCount(int namesCount) { + int pairCount = inputView.readPairCount(); + new PairCountValidator().validate(pairCount, namesCount); + return new PairCount(pairCount); } } diff --git a/src/main/java/leets/leets_mate/domain/PairCount.java b/src/main/java/leets/leets_mate/domain/PairCount.java new file mode 100644 index 0000000..2d641e6 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairCount.java @@ -0,0 +1,14 @@ +package leets.leets_mate.domain; + +public class PairCount { + + private final int value; + + public PairCount(int value) { + this.value = value; + } + + public int value() { + return value; + } +} diff --git a/src/main/java/leets/leets_mate/domain/PairMatcher.java b/src/main/java/leets/leets_mate/domain/PairMatcher.java index 26b29dd..a77ec13 100644 --- a/src/main/java/leets/leets_mate/domain/PairMatcher.java +++ b/src/main/java/leets/leets_mate/domain/PairMatcher.java @@ -5,16 +5,16 @@ public class PairMatcher { - private final int pairCount; + private final PairCount pairCount; private final RandomNumbersGenerator randomNumbersGenerator; - public PairMatcher(int pairCount, RandomNumbersGenerator randomNumbersGenerator) { + public PairMatcher(PairCount pairCount, RandomNumbersGenerator randomNumbersGenerator) { this.pairCount = pairCount; this.randomNumbersGenerator = randomNumbersGenerator; } public List match(Names names) { - List> randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames(), pairCount); + List> randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames(), pairCount.value()); List pairs = new ArrayList<>(); for (List randomNumber : randomNumbers) { diff --git a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java index 7dfda6d..337eb27 100644 --- a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java +++ b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java @@ -27,7 +27,7 @@ void setUp() { @Test @DisplayName("나머지 없이 랜덤으로 짝을 매치한다.") void pairMatcher_Multiple() { - PairMatcher pairMatcher = new PairMatcher(2, new RandomNumbersGenerator() { + PairMatcher pairMatcher = new PairMatcher(new PairCount(2), new RandomNumbersGenerator() { @Override public List> randomNumbers(int bound, int size) { return List.of( @@ -47,7 +47,7 @@ public List> randomNumbers(int bound, int size) { @Test @DisplayName("나머지가 있어도 랜덤으로 짝을 매치한다.") void pairMatcher_overNamesCount_ExceptionThrown() { - PairMatcher pairMatcher = new PairMatcher(3, new RandomNumbersGenerator() { + PairMatcher pairMatcher = new PairMatcher(new PairCount(3), new RandomNumbersGenerator() { @Override public List> randomNumbers(int bound, int size) { return List.of( From c2744c1eddf883b0ce829e7823ad543a91b42415 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 13:46:05 +0900 Subject: [PATCH 21/40] =?UTF-8?q?feat(OutputView):=20=EC=A7=9D=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=20=EC=99=84=EB=A3=8C=20=EB=AC=B8=EA=B5=AC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/controller/Computer.java | 5 +++-- src/main/java/leets/leets_mate/view/OutputView.java | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java index 02e0012..2673f4d 100644 --- a/src/main/java/leets/leets_mate/controller/Computer.java +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -17,10 +17,11 @@ public void run() { PairCount pairCount = readPairCount(names.countNames()); PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator()); - List pairs = pairMatcher.match(names); - outputView.printPairMatchNotice(); + + outputView.printPairMatchResultNotice(); pairs.forEach(pair -> outputView.printPairMatchResult(pair.names())); + outputView.printPairMatchFinishNotice(); } private Names readNames() { diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java index 0219716..e431b14 100644 --- a/src/main/java/leets/leets_mate/view/OutputView.java +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -10,7 +10,7 @@ public void printStartNotice() { System.out.println(); } - public void printPairMatchNotice() { + public void printPairMatchResultNotice() { System.out.println(); System.out.println("오늘의 짝 추천 결과입니다."); } @@ -22,4 +22,9 @@ public void printPairMatchResult(List pairs) { } System.out.println(stringJoiner); } + + public void printPairMatchFinishNotice() { + System.out.println(); + System.out.println("추천을 완료했습니다."); + } } From 09d689c530b1fcaa7cf1aa55ca2f7bffaa0060f2 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:11:37 +0900 Subject: [PATCH 22/40] =?UTF-8?q?feat(RetryOpinion):=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EC=97=AC=EB=B6=80=20=EB=8F=84=EB=A9=94=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/leets_mate/domain/RetryOpinion.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/leets/leets_mate/domain/RetryOpinion.java diff --git a/src/main/java/leets/leets_mate/domain/RetryOpinion.java b/src/main/java/leets/leets_mate/domain/RetryOpinion.java new file mode 100644 index 0000000..e88ad93 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RetryOpinion.java @@ -0,0 +1,28 @@ +package leets.leets_mate.domain; + +import java.util.Arrays; + +public enum RetryOpinion { + + CONTINUE("y", true), + STOP("n", false); + + private final String input; + private final boolean hasRetry; + + RetryOpinion(String input, boolean hasRetry) { + this.input = input; + this.hasRetry = hasRetry; + } + + public static RetryOpinion match(String input) { + return Arrays.stream(values()) + .filter(retryOpinion -> retryOpinion.input.equals(input)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("유효하지 않은 값입니다.")); + } + + public boolean isContinue() { + return this.hasRetry; + } +} From d94132998d84f7aa53bc8d4af1839cd58aa91a51 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:12:00 +0900 Subject: [PATCH 23/40] =?UTF-8?q?feat(InputView):=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EC=97=AC=EB=B6=80=20=EC=9E=85=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/view/InputView.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java index b7b614e..0ce92e3 100644 --- a/src/main/java/leets/leets_mate/view/InputView.java +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -7,7 +7,8 @@ public class InputView { public static final String COMMA = ","; - public static final Pattern FORMAT = Pattern.compile("^[ㄱ-힇]*$"); + public static final Pattern NAME_FORMAT = Pattern.compile("^[ㄱ-힇]*$"); + public static final Pattern RETRY_FORMAT = Pattern.compile("^[y|n]$"); public static final String ERROR_FORMAT = "[ERROR] %s"; private final Scanner scanner = new Scanner(System.in); @@ -28,7 +29,7 @@ public List readNames() { } private void validateInput(String rawName) { - if (!FORMAT.matcher(rawName).matches()) { + if (!NAME_FORMAT.matcher(rawName).matches()) { throw new IllegalArgumentException(String.format(ERROR_FORMAT, "한글만 입력해 주세요.")); } } @@ -53,4 +54,23 @@ private int parseToInt(String input) { throw new IllegalArgumentException(String.format(ERROR_FORMAT, "숫자를 입력해 주세요.")); } } + + public String readRetry() { + System.out.print("다시 구성하시겠습니까? (y or n): "); + + String input = scanner.nextLine(); + try { + validate(input); + return input; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readRetry(); + } + } + + private void validate(String input) { + if (!RETRY_FORMAT.matcher(input).matches()) { + throw new IllegalArgumentException("잘못된 입력입니다."); + } + } } From a44ad9ffe52f234582b55c3622bafd9f315c1201 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:12:17 +0900 Subject: [PATCH 24/40] =?UTF-8?q?feat(OutputView):=20=EA=B2=BD=EA=B3=84?= =?UTF-8?q?=EC=84=A0=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/view/OutputView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java index e431b14..f252bb0 100644 --- a/src/main/java/leets/leets_mate/view/OutputView.java +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -7,7 +7,6 @@ public class OutputView { public void printStartNotice() { System.out.println("[Leets 오늘의 짝에게]를 시작합니다."); - System.out.println(); } public void printPairMatchResultNotice() { @@ -27,4 +26,8 @@ public void printPairMatchFinishNotice() { System.out.println(); System.out.println("추천을 완료했습니다."); } + + public void printBreakLine() { + System.out.println("--------------------------------"); + } } From 5c12142961602f84309560241a0eb85f6872eff4 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:14:21 +0900 Subject: [PATCH 25/40] =?UTF-8?q?feat(OutputView):=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/view/OutputView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java index f252bb0..86b3a4c 100644 --- a/src/main/java/leets/leets_mate/view/OutputView.java +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -30,4 +30,8 @@ public void printPairMatchFinishNotice() { public void printBreakLine() { System.out.println("--------------------------------"); } + + public void printEndNotice() { + System.out.println("자리를 이동해 서로에게 인사해주세요."); + } } From 6579ccda91d95d87d58c7f504a31b48c6023d68c Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:14:39 +0900 Subject: [PATCH 26/40] =?UTF-8?q?feat(Computer):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EB=B7=B0=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/leets_mate/controller/Computer.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java index 2673f4d..2bd72d6 100644 --- a/src/main/java/leets/leets_mate/controller/Computer.java +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -17,8 +17,22 @@ public void run() { PairCount pairCount = readPairCount(names.countNames()); PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator()); + matchPairs(pairMatcher, names); + outputView.printEndNotice(); + } + + private void matchPairs(PairMatcher pairMatcher, Names names) { List pairs = pairMatcher.match(names); + printPairMatchResult(pairs); + + RetryOpinion retryOpinion = readRetry(); + if (retryOpinion.isContinue()) { + outputView.printBreakLine(); + matchPairs(pairMatcher, names); + } + } + private void printPairMatchResult(List pairs) { outputView.printPairMatchResultNotice(); pairs.forEach(pair -> outputView.printPairMatchResult(pair.names())); outputView.printPairMatchFinishNotice(); @@ -37,4 +51,9 @@ private PairCount readPairCount(int namesCount) { new PairCountValidator().validate(pairCount, namesCount); return new PairCount(pairCount); } + + private RetryOpinion readRetry() { + String input = inputView.readRetry(); + return RetryOpinion.match(input); + } } From 47d1628a8b51d00bfa061e8bc859b5c3266d0d1d Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:23:23 +0900 Subject: [PATCH 27/40] =?UTF-8?q?feat(Computer):=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EC=A7=9D=20=EC=88=98=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/controller/Computer.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java index 2bd72d6..aecb8ac 100644 --- a/src/main/java/leets/leets_mate/controller/Computer.java +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -48,8 +48,13 @@ private Names readNames() { private PairCount readPairCount(int namesCount) { int pairCount = inputView.readPairCount(); - new PairCountValidator().validate(pairCount, namesCount); - return new PairCount(pairCount); + try { + new PairCountValidator().validate(pairCount, namesCount); + return new PairCount(pairCount); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readPairCount(namesCount); + } } private RetryOpinion readRetry() { From 5f175102927cf23cc9fd9225d125406d66113d8f Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:27:59 +0900 Subject: [PATCH 28/40] =?UTF-8?q?refactor(Names):=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=9C=EC=84=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/leets/leets_mate/domain/Names.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index 2c3e3ea..c8f3b97 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -21,6 +21,12 @@ public List findByIndexes(List indexes) { .toList(); } + public List names() { + return names.stream() + .map(Name::asString) + .toList(); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -33,10 +39,4 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(names); } - - public List names() { - return names.stream() - .map(Name::asString) - .toList(); - } } From f5719b37ad10bd3eaba4accc01a1809ff4eba569 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:28:15 +0900 Subject: [PATCH 29/40] =?UTF-8?q?refactor(Name):=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/domain/Name.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/leets/leets_mate/domain/Name.java b/src/main/java/leets/leets_mate/domain/Name.java index ccee82d..7145439 100644 --- a/src/main/java/leets/leets_mate/domain/Name.java +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -4,6 +4,7 @@ public class Name { + private static final String ERROR_FORMAT = "[ERROR] 이름은 %d자 이하여야 합니다."; private static final int MAX_LENGTH = 5; private final String name; @@ -15,7 +16,7 @@ public Name(String name) { private void validate(String name) { if (name.length() > MAX_LENGTH) { - throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MAX_LENGTH)); } } From 5e0fa8531517029611bcfdba017ed89782bfe261 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:28:57 +0900 Subject: [PATCH 30/40] =?UTF-8?q?refactor(PairMatcher):=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=EB=AC=B8=20=EB=8C=80=EC=8B=A0=20stream=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/PairMatcher.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/PairMatcher.java b/src/main/java/leets/leets_mate/domain/PairMatcher.java index a77ec13..d5873b2 100644 --- a/src/main/java/leets/leets_mate/domain/PairMatcher.java +++ b/src/main/java/leets/leets_mate/domain/PairMatcher.java @@ -1,6 +1,5 @@ package leets.leets_mate.domain; -import java.util.ArrayList; import java.util.List; public class PairMatcher { @@ -15,13 +14,9 @@ public PairMatcher(PairCount pairCount, RandomNumbersGenerator randomNumbersGene public List match(Names names) { List> randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames(), pairCount.value()); - - List pairs = new ArrayList<>(); - for (List randomNumber : randomNumbers) { - List pairNames = names.findByIndexes(randomNumber); - Pair pair = new Pair(pairNames); - pairs.add(pair); - } - return pairs; + return randomNumbers.stream() + .map(names::findByIndexes) + .map(Pair::new) + .toList(); } } From 12eac092ff2ed3f30ced8cf8488c19f6abdbec07 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 14:59:36 +0900 Subject: [PATCH 31/40] =?UTF-8?q?test(NamesTest):=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=84=A4=EB=AA=85=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/leets/leets_mate/domain/NamesTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/leets/leets_mate/domain/NamesTest.java b/src/test/java/leets/leets_mate/domain/NamesTest.java index ec8698e..ff424aa 100644 --- a/src/test/java/leets/leets_mate/domain/NamesTest.java +++ b/src/test/java/leets/leets_mate/domain/NamesTest.java @@ -23,6 +23,7 @@ void countNames() { } @Test + @DisplayName("해당 위치에 존재하는 이름을 반환한다.") void findByIndexes() { List namesByIndexes = names.findByIndexes(List.of(1, 3)); From 5e29d8ed2416a63f7ebbe1a168dbd22230327604 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:05:35 +0900 Subject: [PATCH 32/40] =?UTF-8?q?test(RandomNumbers):=20=ED=8A=B9=EC=A0=95?= =?UTF-8?q?=20=EC=82=AC=EC=9D=B4=EC=A6=88=EB=A1=9C=20=EC=9E=90=EB=A5=B4?= =?UTF-8?q?=EB=8A=94=20=EC=97=AD=ED=95=A0=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/Names.java | 4 +++ .../leets/leets_mate/domain/PairMatcher.java | 5 ++-- .../leets_mate/domain/RandomNumbers.java | 30 +++++++++++++++++++ .../domain/RandomNumbersGenerator.java | 14 +++------ .../leets_mate/domain/PairMatcherTest.java | 15 ++++------ 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/main/java/leets/leets_mate/domain/RandomNumbers.java diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index c8f3b97..88c3231 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -21,6 +21,10 @@ public List findByIndexes(List indexes) { .toList(); } + public List findByIndexes(RandomNumbers randomNumbers) { + return randomNumbers.findNames(names); + } + public List names() { return names.stream() .map(Name::asString) diff --git a/src/main/java/leets/leets_mate/domain/PairMatcher.java b/src/main/java/leets/leets_mate/domain/PairMatcher.java index d5873b2..fcdc32a 100644 --- a/src/main/java/leets/leets_mate/domain/PairMatcher.java +++ b/src/main/java/leets/leets_mate/domain/PairMatcher.java @@ -13,8 +13,9 @@ public PairMatcher(PairCount pairCount, RandomNumbersGenerator randomNumbersGene } public List match(Names names) { - List> randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames(), pairCount.value()); - return randomNumbers.stream() + RandomNumbers randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames()); + List splitRandomNumbers = randomNumbers.splitBySize(pairCount.value()); + return splitRandomNumbers.stream() .map(names::findByIndexes) .map(Pair::new) .toList(); diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbers.java b/src/main/java/leets/leets_mate/domain/RandomNumbers.java new file mode 100644 index 0000000..613776f --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RandomNumbers.java @@ -0,0 +1,30 @@ +package leets.leets_mate.domain; + +import java.util.ArrayList; +import java.util.List; + +public class RandomNumbers { + + private final List values; + + public RandomNumbers(List values) { + this.values = values; + } + + public List splitBySize(int size) { + int length = values.size(); + List randomIndexes = new ArrayList<>(); + for (int index = 0; index < length; index += size) { + int end = Math.min(index + size, length); + List randomNumbers = values.subList(index, end); + randomIndexes.add(new RandomNumbers(randomNumbers)); + } + return randomIndexes; + } + + public List findNames(List names) { + return values.stream() + .map(names::get) + .toList(); + } +} diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java index 75981c9..a3096a8 100644 --- a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java +++ b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java @@ -7,17 +7,11 @@ public class RandomNumbersGenerator { - public List> randomNumbers(int bound, int size) { - List integers = new ArrayList<>(IntStream.range(0, bound) + public RandomNumbers randomNumbers(int bound) { + List randomNumbers = new ArrayList<>(IntStream.range(0, bound) .boxed() .toList()); - Collections.shuffle(integers); - - List> randomIndexes = new ArrayList<>(); - for (int index = 0; index < bound; index += size) { - int end = Math.min(index + size, bound); - randomIndexes.add(integers.subList(index, end)); - } - return randomIndexes; + Collections.shuffle(randomNumbers); + return new RandomNumbers(randomNumbers); } } diff --git a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java index 337eb27..a26b61d 100644 --- a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java +++ b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java @@ -28,11 +28,10 @@ void setUp() { @DisplayName("나머지 없이 랜덤으로 짝을 매치한다.") void pairMatcher_Multiple() { PairMatcher pairMatcher = new PairMatcher(new PairCount(2), new RandomNumbersGenerator() { + @Override - public List> randomNumbers(int bound, int size) { - return List.of( - List.of(0, 3), - List.of(1, 2)); + public RandomNumbers randomNumbers(int bound) { + return new RandomNumbers(List.of(0, 3, 1, 2)); } }); @@ -48,12 +47,10 @@ public List> randomNumbers(int bound, int size) { @DisplayName("나머지가 있어도 랜덤으로 짝을 매치한다.") void pairMatcher_overNamesCount_ExceptionThrown() { PairMatcher pairMatcher = new PairMatcher(new PairCount(3), new RandomNumbersGenerator() { + @Override - public List> randomNumbers(int bound, int size) { - return List.of( - List.of(0, 3, 1), - List.of(2) - ); + public RandomNumbers randomNumbers(int bound) { + return new RandomNumbers(List.of(0, 3, 1, 2)); } }); From 827610182a6d850dc2fcab6fa868500e99c51b8e Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:15:17 +0900 Subject: [PATCH 33/40] =?UTF-8?q?fix(InputView):=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=A0=95=EA=B7=9C=ED=91=9C=ED=98=84=EC=8B=9D=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/leets/leets_mate/view/InputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java index 0ce92e3..0e9580d 100644 --- a/src/main/java/leets/leets_mate/view/InputView.java +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -7,7 +7,7 @@ public class InputView { public static final String COMMA = ","; - public static final Pattern NAME_FORMAT = Pattern.compile("^[ㄱ-힇]*$"); + public static final Pattern NAME_FORMAT = Pattern.compile("^[ㄱ-ㅎ|가-힣]+$"); public static final Pattern RETRY_FORMAT = Pattern.compile("^[y|n]$"); public static final String ERROR_FORMAT = "[ERROR] %s"; From 6f84ccf029cf00e9cbf23e8080e828b3d472a3bb Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:15:44 +0900 Subject: [PATCH 34/40] =?UTF-8?q?feat(Names):=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/domain/Name.java | 2 +- src/main/java/leets/leets_mate/domain/Names.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/leets/leets_mate/domain/Name.java b/src/main/java/leets/leets_mate/domain/Name.java index 7145439..01edd9e 100644 --- a/src/main/java/leets/leets_mate/domain/Name.java +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -4,8 +4,8 @@ public class Name { - private static final String ERROR_FORMAT = "[ERROR] 이름은 %d자 이하여야 합니다."; private static final int MAX_LENGTH = 5; + private static final String ERROR_FORMAT = "[ERROR] 이름은 %d자 이하여야 합니다."; private final String name; diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index 88c3231..8247c6c 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -5,12 +5,22 @@ public class Names { + private static final int MIN_SIZE = 2; + private static final String ERROR_FORMAT = "[ERROR] 이름은 %d개 이상이어야 합니다."; + private final List names; public Names(List names) { + validate(names); this.names = names; } + private void validate(List names) { + if (names.size() < MIN_SIZE) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_SIZE)); + } + } + public int countNames() { return names.size(); } From 3b6cd418d06ccdd28bd2ef145e2c9ec93071fc64 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:16:06 +0900 Subject: [PATCH 35/40] =?UTF-8?q?feat(OutputView):=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/controller/Computer.java | 13 +++++++++---- src/main/java/leets/leets_mate/view/OutputView.java | 4 ++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java index aecb8ac..dc0310b 100644 --- a/src/main/java/leets/leets_mate/controller/Computer.java +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -40,10 +40,15 @@ private void printPairMatchResult(List pairs) { private Names readNames() { List rawNames = inputView.readNames(); - List names = rawNames.stream() - .map(Name::new) - .toList(); - return new Names(names); + try { + List names = rawNames.stream() + .map(Name::new) + .toList(); + return new Names(names); + } catch (IllegalArgumentException e) { + outputView.printError(e.getMessage()); + return readNames(); + } } private PairCount readPairCount(int namesCount) { diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java index 86b3a4c..87896dc 100644 --- a/src/main/java/leets/leets_mate/view/OutputView.java +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -34,4 +34,8 @@ public void printBreakLine() { public void printEndNotice() { System.out.println("자리를 이동해 서로에게 인사해주세요."); } + + public void printError(String message) { + System.out.println(message); + } } From 3cef975d620ed9ecc0fc37dd8041c659d60349ad Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:30:24 +0900 Subject: [PATCH 36/40] =?UTF-8?q?refactor(Pair):=20=EC=A7=9D=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/leets_mate/domain/Names.java | 6 ------ src/main/java/leets/leets_mate/domain/Pair.java | 8 +++++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java index 8247c6c..864586d 100644 --- a/src/main/java/leets/leets_mate/domain/Names.java +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -35,12 +35,6 @@ public List findByIndexes(RandomNumbers randomNumbers) { return randomNumbers.findNames(names); } - public List names() { - return names.stream() - .map(Name::asString) - .toList(); - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/leets/leets_mate/domain/Pair.java b/src/main/java/leets/leets_mate/domain/Pair.java index 776c1a7..87c2cba 100644 --- a/src/main/java/leets/leets_mate/domain/Pair.java +++ b/src/main/java/leets/leets_mate/domain/Pair.java @@ -5,14 +5,16 @@ public class Pair { - private final Names names; + private final List names; public Pair(List names) { - this.names = new Names(names); + this.names = names; } public List names() { - return names.names(); + return names.stream() + .map(Name::asString) + .toList(); } @Override From c2f6f16bb0287c6d03cc9587a18f1a2afec7c9d0 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Mon, 8 Apr 2024 15:31:16 +0900 Subject: [PATCH 37/40] =?UTF-8?q?refactor(RandomNumbers):=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=20=EC=9E=90=EB=A5=B4=EA=B8=B0=20=EB=B0=98=EB=B3=B5?= =?UTF-8?q?=EB=AC=B8=20=EB=8C=80=EC=8B=A0=20stream=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/leets_mate/domain/RandomNumbers.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbers.java b/src/main/java/leets/leets_mate/domain/RandomNumbers.java index 613776f..cfa98b4 100644 --- a/src/main/java/leets/leets_mate/domain/RandomNumbers.java +++ b/src/main/java/leets/leets_mate/domain/RandomNumbers.java @@ -1,7 +1,7 @@ package leets.leets_mate.domain; -import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; public class RandomNumbers { @@ -13,13 +13,10 @@ public RandomNumbers(List values) { public List splitBySize(int size) { int length = values.size(); - List randomIndexes = new ArrayList<>(); - for (int index = 0; index < length; index += size) { - int end = Math.min(index + size, length); - List randomNumbers = values.subList(index, end); - randomIndexes.add(new RandomNumbers(randomNumbers)); - } - return randomIndexes; + return IntStream.iterate(0, i -> i < length, i -> i + size) + .mapToObj(i -> values.subList(i, Math.min(i + size, length))) + .map(RandomNumbers::new) + .toList(); } public List findNames(List names) { From 15349380e87f8d4d9d2890b62f0b1bc80a6449ec Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Tue, 9 Apr 2024 22:25:31 +0900 Subject: [PATCH 38/40] =?UTF-8?q?fix(Application):=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A4=91=EB=B3=B5=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 --- src/main/java/leets/leets_mate/Application.java | 10 ---------- .../java/leets/leets_mate/LeetsMateApplication.java | 5 ++++- 2 files changed, 4 insertions(+), 11 deletions(-) delete mode 100644 src/main/java/leets/leets_mate/Application.java diff --git a/src/main/java/leets/leets_mate/Application.java b/src/main/java/leets/leets_mate/Application.java deleted file mode 100644 index de2187e..0000000 --- a/src/main/java/leets/leets_mate/Application.java +++ /dev/null @@ -1,10 +0,0 @@ -package leets.leets_mate; - -import leets.leets_mate.controller.Computer; - -public class Application { - public static void main(String[] args) { - Computer computer = new Computer(); - computer.run(); - } -} diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index bfa6bf2..e85d0f6 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -1,8 +1,11 @@ package leets.leets_mate; +import leets.leets_mate.controller.Computer; + public class LeetsMateApplication { public static void main(String[] args) { - + Computer computer = new Computer(); + computer.run(); } } \ No newline at end of file From 1d936a2209206272520481a2257cb852629cbbb4 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Wed, 10 Apr 2024 16:49:49 +0900 Subject: [PATCH 39/40] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 55a89fa..bf8bf98 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,12 +5,12 @@ - [ ] 참석자들의 이름을 입력 받는다 - [x] `,` 로 구분한다. - [x] 한글이 아니라면 예외가 발생한다. - - [ ] 이름은 중복될 수 없다. -- [ ] 최대 짝(그룹) 인원 수를 입력 받는다. + - [x] 이름은 중복될 수 없다. +- [x] 최대 짝(그룹) 인원 수를 입력 받는다. - [x] 숫자가 아니라면 예외가 발생한다. - - [ ] 이름 수 < 최대 짝(그룹) 인원 수인 경우 예외가 발생한다. -- [ ] 재추천 여부를 입력 받는다. - - [ ] `y` 또는 `n` 가 아니라면 예외가 발생한다. + - [x] 이름 수 < 최대 짝(그룹) 인원 수인 경우 예외가 발생한다. +- [x] 재추천 여부를 입력 받는다. + - [x] `y` 또는 `n` 가 아니라면 예외가 발생한다. **출력** @@ -24,7 +24,7 @@ **짝** -- [ ] 최대 짝 수는 사람 수보다 작거나 같아야 한다. +- [x] 최대 짝 수는 사람 수보다 작거나 같아야 한다. **매칭** From 588bf304770d74c49b8c3d19454d9a6d14ade9d6 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Wed, 10 Apr 2024 17:00:04 +0900 Subject: [PATCH 40/40] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index bf8bf98..11bd9d2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ **입력** -- [ ] 참석자들의 이름을 입력 받는다 +- [x] 참석자들의 이름을 입력 받는다 - [x] `,` 로 구분한다. - [x] 한글이 아니라면 예외가 발생한다. - [x] 이름은 중복될 수 없다.