From 99b1f3a2797be7887e0f7ad117eb9b50f07af9c4 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sun, 26 Mar 2023 20:47:30 +0900 Subject: [PATCH 01/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD,=20=EC=9C=A0=EB=B9=84=EC=BF=BC?= =?UTF-8?q?=ED=84=B0=EC=8A=A4=20=EC=96=B8=EC=96=B4=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index b722ac00..51a38a44 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,27 @@ # 미션 - 워들 +## 기능 요구 사항 +* Words + * [ ] `words.txt`에 있는 존재하는 정보를 가져온다. + * [ ] 정답을 가져온다. + * [ ] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. + * [ ] 입력된 답안을 존재하는 Word 인지 비교한다. +* 답안 + * [ ] 사용자가 워드를 입력한다. + * [ ] 글자는 5글자까지 입력 가능하다. + * [ ] 사용자가 정답을 6번까지 입력할 수 있다. + * [ ] 입력된 답안은 `words.txt`에 존재하는 단어여야 한다. +* 출력 + * [ ] 타일로 결과를 표시한다. + * [ ] 위치와 글자가 맞으면 초록색 + * [ ] 위치가 틀리고, 글자가 맞으면 노란색 + * [ ] 위치와 글자가 틀리면 회색 + * [ ] 두 개의 동일한 문자를 입력하고 그중 하나가 회색으로 표시되면 해당 문자 중 하나만 최종 단어에 나타난다. + +## 유비쿼터스 언어 +* Word + * 낱말 5개의 집합 +* Words + * `words.txt`의 리스트 ## 🔍 진행 방식 From 055067c3ab816b65636b9e4b849d61567ea7a1dd Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sun, 26 Mar 2023 22:13:47 +0900 Subject: [PATCH 02/30] =?UTF-8?q?feat:=20Words=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/config/FileConfig.java | 6 ++++++ src/main/java/support/WordsGenerator.java | 17 +++++++++++++++++ src/test/java/support/WordsGeneratorTest.java | 19 +++++++++++++++++++ src/test/resources/words.txt | 5 +++++ 4 files changed, 47 insertions(+) create mode 100644 src/main/java/config/FileConfig.java create mode 100644 src/main/java/support/WordsGenerator.java create mode 100644 src/test/java/support/WordsGeneratorTest.java create mode 100644 src/test/resources/words.txt diff --git a/src/main/java/config/FileConfig.java b/src/main/java/config/FileConfig.java new file mode 100644 index 00000000..c1a5351d --- /dev/null +++ b/src/main/java/config/FileConfig.java @@ -0,0 +1,6 @@ +package config; + +public class FileConfig { + + private final static String FILE_PATH = "src/main/resources/words.txt"; +} diff --git a/src/main/java/support/WordsGenerator.java b/src/main/java/support/WordsGenerator.java new file mode 100644 index 00000000..4fb89191 --- /dev/null +++ b/src/main/java/support/WordsGenerator.java @@ -0,0 +1,17 @@ +package support; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +public class WordsGenerator { + + public static List read(String filePath) { + try { + return Files.readAllLines(Paths.get(filePath)); + } catch (IOException e) { + throw new RuntimeException("파일을 읽을 수 없습니다.", e); + } + } +} diff --git a/src/test/java/support/WordsGeneratorTest.java b/src/test/java/support/WordsGeneratorTest.java new file mode 100644 index 00000000..3f8b9e1f --- /dev/null +++ b/src/test/java/support/WordsGeneratorTest.java @@ -0,0 +1,19 @@ +package support; + +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 WordsGeneratorTest { + + @DisplayName("파일에서 Words 를 읽어온다.") + @Test + void test01() { + List words = WordsGenerator.read("src/test/resources/words.txt"); + + assertThat(words.size()).isEqualTo(5); + } +} \ No newline at end of file diff --git a/src/test/resources/words.txt b/src/test/resources/words.txt new file mode 100644 index 00000000..3195f258 --- /dev/null +++ b/src/test/resources/words.txt @@ -0,0 +1,5 @@ +cigar +rebut +sissy +humph +awake From 5b2d7a1ed5108657001836ccc4085a651a5e8ae4 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sun, 26 Mar 2023 22:14:10 +0900 Subject: [PATCH 03/30] =?UTF-8?q?feat:=20Words=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Words.java | 33 +++++++++++++++++++ src/test/java/domain/WordsTest.java | 50 +++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/main/java/domain/Words.java create mode 100644 src/test/java/domain/WordsTest.java diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java new file mode 100644 index 00000000..e822a75a --- /dev/null +++ b/src/main/java/domain/Words.java @@ -0,0 +1,33 @@ +package domain; + +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class Words { + + private static final Pattern pattern = Pattern.compile("^[a-zA-Z]*"); + + private final List words; + + public Words(List words) { + if (words.size() == 0) { + throw new IllegalStateException("파일이 비어 있습니다."); + } + + List filterWords = words.stream() + .filter(word -> word.length() == 5) + .filter(word -> pattern.matcher(word).matches()) + .collect(Collectors.toList()); + + if (filterWords.size() == 0) { + throw new IllegalStateException("5글자인 단어가 존재하지 않습니다."); + } + + this.words = filterWords; + } + + public List getWords() { + return words; + } +} diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java new file mode 100644 index 00000000..1be9a6ab --- /dev/null +++ b/src/test/java/domain/WordsTest.java @@ -0,0 +1,50 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class WordsTest { + + @DisplayName("Word 를 생성한다.") + @Test + void test01() { + Words words = new Words(List.of("MySQL", "SLiPP")); + + assertThat(words.getWords()).containsExactly("MySQL", "SLiPP"); + } + + @DisplayName("파일에서 문자와 숫자가 섞인 Words 를 읽어온다.") + @Test + void test02() { + Words words = new Words(List.of("MySQL", "cake", "12345")); + + assertThat(words.getWords()).containsExactly("MySQL"); + } + + @DisplayName("파일에서 빈 Words 를 읽어온다.") + @Test + void test03() { + assertThatThrownBy(() -> new Words(Collections.emptyList())) + .isInstanceOf(IllegalStateException.class); + } + + @DisplayName("파일에서 5글자가 아닌 Words 를 읽어온다.") + @Test + void test04() { + assertThatThrownBy(() -> new Words(List.of("sister", "cake"))) + .isInstanceOf(IllegalStateException.class); + } + + @DisplayName("파일에서 알파벳으로만 이루어지지 않은 Words 를 읽어온다.") + @Test + void test05() { + assertThatThrownBy(() -> new Words(List.of("12345", "a1234"))) + .isInstanceOf(IllegalStateException.class); + } +} \ No newline at end of file From 62c685f0f1c0c1eccbc2dbb487326ce5095cec63 Mon Sep 17 00:00:00 2001 From: saerang Date: Mon, 27 Mar 2023 20:47:04 +0900 Subject: [PATCH 04/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51a38a44..f78df7c3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ # 미션 - 워들 ## 기능 요구 사항 +* Words Generator + * [X] 파일에서 Words 를 읽어온다. * Words - * [ ] `words.txt`에 있는 존재하는 정보를 가져온다. + * [x] `words.txt`에 있는 존재하는 정보를 가져온다. + * [x] Word 를 생성한다. + * [x] 문자와 숫자가 섞인 파일에서 Word 만 읽어온다. + * [x] 주어진 Words 가 비어있으면 에러가 발생한다. + * [x] 주어진 Words 에 Word 가 없다면 에러가 발생한다. * [ ] 정답을 가져온다. * [ ] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. * [ ] 입력된 답안을 존재하는 Word 인지 비교한다. @@ -19,7 +25,7 @@ ## 유비쿼터스 언어 * Word - * 낱말 5개의 집합 + * 5글자의 영문 * Words * `words.txt`의 리스트 From 407bd21abda14bf62ea16579b80a9f9630b318c9 Mon Sep 17 00:00:00 2001 From: saerang Date: Mon, 27 Mar 2023 20:57:23 +0900 Subject: [PATCH 05/30] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C,?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Words.java | 22 +++++++++++++------ src/test/java/domain/WordsTest.java | 34 +++++++++++++++-------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index e822a75a..7ebfecc1 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -7,6 +7,7 @@ public class Words { private static final Pattern pattern = Pattern.compile("^[a-zA-Z]*"); + public static final int WORD_LENGTH = 5; private final List words; @@ -15,19 +16,26 @@ public Words(List words) { throw new IllegalStateException("파일이 비어 있습니다."); } - List filterWords = words.stream() - .filter(word -> word.length() == 5) - .filter(word -> pattern.matcher(word).matches()) - .collect(Collectors.toList()); + List matchWords = this.getMatchWords(words); - if (filterWords.size() == 0) { + if (matchWords.size() == 0) { throw new IllegalStateException("5글자인 단어가 존재하지 않습니다."); } - this.words = filterWords; + this.words = matchWords; } - public List getWords() { + private List getMatchWords(List words) { + return words.stream() + .filter(this::isMatchWord) + .collect(Collectors.toList()); + } + + private boolean isMatchWord(String word){ + return word.length() == WORD_LENGTH && pattern.matcher(word).matches(); + } + + public List getMatchWords() { return words; } } diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index 1be9a6ab..7e3bb3d4 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -2,9 +2,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -16,35 +20,33 @@ class WordsTest { void test01() { Words words = new Words(List.of("MySQL", "SLiPP")); - assertThat(words.getWords()).containsExactly("MySQL", "SLiPP"); + assertThat(words.getMatchWords()).containsExactly("MySQL", "SLiPP"); } - @DisplayName("파일에서 문자와 숫자가 섞인 Words 를 읽어온다.") + @DisplayName("문자와 숫자가 섞인 파일에서 Words 를 읽어온다.") @Test void test02() { Words words = new Words(List.of("MySQL", "cake", "12345")); - assertThat(words.getWords()).containsExactly("MySQL"); + assertThat(words.getMatchWords()).containsExactly("MySQL"); } - @DisplayName("파일에서 빈 Words 를 읽어온다.") + @DisplayName("주어진 Words 가 비어있으면 에러가 발생한다.") @Test void test03() { - assertThatThrownBy(() -> new Words(Collections.emptyList())) - .isInstanceOf(IllegalStateException.class); + assertThatThrownBy(() -> new Words(Collections.emptyList())).isInstanceOf(IllegalStateException.class); } - @DisplayName("파일에서 5글자가 아닌 Words 를 읽어온다.") - @Test - void test04() { - assertThatThrownBy(() -> new Words(List.of("sister", "cake"))) - .isInstanceOf(IllegalStateException.class); + @DisplayName("주어진 Words 에 Word 가 없다면 에러가 발생한다.") + @ParameterizedTest + @MethodSource("generateData") + void test04(List words) { + assertThatThrownBy(() -> new Words(words)).isInstanceOf(IllegalStateException.class); } - @DisplayName("파일에서 알파벳으로만 이루어지지 않은 Words 를 읽어온다.") - @Test - void test05() { - assertThatThrownBy(() -> new Words(List.of("12345", "a1234"))) - .isInstanceOf(IllegalStateException.class); + static Stream generateData() { + return Stream.of( + Arguments.of(List.of("sister", "cake")), + Arguments.of(List.of("12345", "a1234"))); } } \ No newline at end of file From 01c5f7a95fbb662be94d93577604d4825f8110af Mon Sep 17 00:00:00 2001 From: saerang Date: Mon, 27 Mar 2023 21:21:37 +0900 Subject: [PATCH 06/30] =?UTF-8?q?feat:=20word=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Word.java | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/domain/Word.java diff --git a/src/main/java/domain/Word.java b/src/main/java/domain/Word.java new file mode 100644 index 00000000..8810da0f --- /dev/null +++ b/src/main/java/domain/Word.java @@ -0,0 +1,43 @@ +package domain; + +import java.util.Objects; +import java.util.regex.Pattern; + +public class Word { + public static final int WORD_LENGTH = 5; + private static final Pattern pattern = Pattern.compile("^[a-zA-Z]*"); + + private final String word; + + public Word(String word) { + if (this.isNotMatchWord(word)) { + throw new IllegalArgumentException(word + "는 5글자의 알파벳이 아닙니다."); + } + + this.word = word; + } + + private boolean isNotMatchWord(String word){ + return word.length() != WORD_LENGTH || !pattern.matcher(word).matches(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Word word1 = (Word) o; + return Objects.equals(word, word1.word); + } + + @Override + public int hashCode() { + return Objects.hash(word); + } + + @Override + public String toString() { + return "Word{" + + "word='" + word + '\'' + + '}'; + } +} From e52324359a1e804585458bd360271f3dac67a6f7 Mon Sep 17 00:00:00 2001 From: saerang Date: Mon, 27 Mar 2023 21:23:20 +0900 Subject: [PATCH 07/30] =?UTF-8?q?feat:=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Words.java | 33 +++++++---------------------- src/test/java/domain/WordsTest.java | 19 ++++++----------- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index 7ebfecc1..73869f1b 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -1,41 +1,24 @@ package domain; import java.util.List; -import java.util.regex.Pattern; import java.util.stream.Collectors; public class Words { - - private static final Pattern pattern = Pattern.compile("^[a-zA-Z]*"); - public static final int WORD_LENGTH = 5; - - private final List words; + private final List words; public Words(List words) { - if (words.size() == 0) { - throw new IllegalStateException("파일이 비어 있습니다."); - } - - List matchWords = this.getMatchWords(words); - - if (matchWords.size() == 0) { - throw new IllegalStateException("5글자인 단어가 존재하지 않습니다."); - } - - this.words = matchWords; + this.words = convert(words); } - private List getMatchWords(List words) { - return words.stream() - .filter(this::isMatchWord) - .collect(Collectors.toList()); - } + private List convert(List words) { + if (words.size() == 0) { + throw new IllegalArgumentException("파일이 비어 있습니다."); + } - private boolean isMatchWord(String word){ - return word.length() == WORD_LENGTH && pattern.matcher(word).matches(); + return words.stream().map(Word::new).collect(Collectors.toList()); } - public List getMatchWords() { + public List getWords() { return words; } } diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index 7e3bb3d4..5f86258d 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -20,32 +20,25 @@ class WordsTest { void test01() { Words words = new Words(List.of("MySQL", "SLiPP")); - assertThat(words.getMatchWords()).containsExactly("MySQL", "SLiPP"); - } - - @DisplayName("문자와 숫자가 섞인 파일에서 Words 를 읽어온다.") - @Test - void test02() { - Words words = new Words(List.of("MySQL", "cake", "12345")); - - assertThat(words.getMatchWords()).containsExactly("MySQL"); + assertThat(words.getWords()).containsExactly(new Word("MySQL"), new Word("SLiPP")); } @DisplayName("주어진 Words 가 비어있으면 에러가 발생한다.") @Test - void test03() { - assertThatThrownBy(() -> new Words(Collections.emptyList())).isInstanceOf(IllegalStateException.class); + void test02() { + assertThatThrownBy(() -> new Words(Collections.emptyList())).isInstanceOf(IllegalArgumentException.class); } @DisplayName("주어진 Words 에 Word 가 없다면 에러가 발생한다.") @ParameterizedTest @MethodSource("generateData") - void test04(List words) { - assertThatThrownBy(() -> new Words(words)).isInstanceOf(IllegalStateException.class); + void test03(List words) { + assertThatThrownBy(() -> new Words(words)).isInstanceOf(IllegalArgumentException.class); } static Stream generateData() { return Stream.of( + Arguments.of(List.of("MySQL", "cake", "12345")), Arguments.of(List.of("sister", "cake")), Arguments.of(List.of("12345", "a1234"))); } From f52a5f023333c8f8da93866922c4b203eba77770 Mon Sep 17 00:00:00 2001 From: saerang Date: Mon, 27 Mar 2023 21:29:22 +0900 Subject: [PATCH 08/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f78df7c3..de5c08aa 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ # 미션 - 워들 ## 기능 요구 사항 * Words Generator - * [X] 파일에서 Words 를 읽어온다. + * [X] `words.txt`에서 Words 를 읽어온다. +* Word + * [ ] Word 를 생성한다. + * [ ] 5글자의 알파벳만 받는다. + * [ ] 5글자가 아니면 에러를 발생한다. + * [ ] 알파벳이 아니면 에러를 발생한다. * Words - * [x] `words.txt`에 있는 존재하는 정보를 가져온다. - * [x] Word 를 생성한다. - * [x] 문자와 숫자가 섞인 파일에서 Word 만 읽어온다. - * [x] 주어진 Words 가 비어있으면 에러가 발생한다. - * [x] 주어진 Words 에 Word 가 없다면 에러가 발생한다. + * [x] Words 를 생성한다. + * [x] 주어진 Words 가 비어있으면 에러를 발생한다. + * [x] 주어진 Words 에 Word 가 없다면 에러를 발생한다. * [ ] 정답을 가져온다. * [ ] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. * [ ] 입력된 답안을 존재하는 Word 인지 비교한다. From 70f41faf8c9b34c9f1e59ac80322335777061dc1 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Tue, 28 Mar 2023 20:24:36 +0900 Subject: [PATCH 09/30] =?UTF-8?q?test:=20word=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Word.java | 4 ++++ src/test/java/domain/WordTest.java | 33 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/test/java/domain/WordTest.java diff --git a/src/main/java/domain/Word.java b/src/main/java/domain/Word.java index 8810da0f..2f088fe4 100644 --- a/src/main/java/domain/Word.java +++ b/src/main/java/domain/Word.java @@ -21,6 +21,10 @@ private boolean isNotMatchWord(String word){ return word.length() != WORD_LENGTH || !pattern.matcher(word).matches(); } + public String getWord() { + return word; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/test/java/domain/WordTest.java b/src/test/java/domain/WordTest.java new file mode 100644 index 00000000..51f2d9ab --- /dev/null +++ b/src/test/java/domain/WordTest.java @@ -0,0 +1,33 @@ +package domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class WordTest { + + @DisplayName("Word 를 생성한다.") + @Test + void test01() { + Word word = new Word("SLiPP"); + + assertThat(word.getWord()).isEqualTo("SLiPP"); + } + + @DisplayName("Word 가 5글자가 아니면 에러를 발생한다.") + @Test + void test02() { + assertThatThrownBy(() -> new Word("Real")) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("Word 가 알파벳이 아니면 에러를 발생한다.") + @Test + void test03() { + assertThatThrownBy(() -> new Word("12345")) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From cb1dc6b156bc5221ce7a5891705c8a13a3090fb6 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Tue, 28 Mar 2023 20:46:01 +0900 Subject: [PATCH 10/30] =?UTF-8?q?feat:=20Words=20=EC=A0=95=EB=8B=B5?= =?UTF-8?q?=EC=9D=84=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Words.java | 8 ++++++++ src/test/java/domain/WordsTest.java | 31 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index 73869f1b..8595e458 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -1,5 +1,7 @@ package domain; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.stream.Collectors; @@ -18,6 +20,12 @@ private List convert(List words) { return words.stream().map(Word::new).collect(Collectors.toList()); } + public Word getResult(LocalDate now) { + long between = ChronoUnit.DAYS.between(LocalDate.of(2021, 6, 19), now); + + return this.words.get((int) (between % words.size())); + } + public List getWords() { return words; } diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index 5f86258d..8d44203f 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.time.LocalDate; import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -42,4 +43,34 @@ static Stream generateData() { Arguments.of(List.of("sister", "cake")), Arguments.of(List.of("12345", "a1234"))); } + + @DisplayName("정답을 가져온다.") + @Test + void test04() { + Words words = new Words(List.of("MySQL", "SLiPP", "words")); + + Word word = words.getResult(LocalDate.of(2021, 6, 22)); + + assertThat(word).isEqualTo(new Word("MySQL")); + } + + @DisplayName("정답을 가져온다.") + @Test + void test05() { + Words words = new Words(List.of("MySQL", "SLiPP", "words")); + + Word word = words.getResult(LocalDate.of(2021, 6, 21)); + + assertThat(word).isEqualTo(new Word("words")); + } + + @DisplayName("정답을 가져온다.") + @Test + void test06() { + Words words = new Words(List.of("MySQL", "SLiPP", "words")); + + Word word = words.getResult(LocalDate.of(2021, 6, 23)); + + assertThat(word).isEqualTo(new Word("SLiPP")); + } } \ No newline at end of file From 96c91f7dd185840b0a51ffcec692da9b19ec2130 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Tue, 28 Mar 2023 20:54:11 +0900 Subject: [PATCH 11/30] =?UTF-8?q?feat:=20=EC=A0=95=EB=8B=B5=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CorrectAnswer.java | 25 +++++++++++++++++++++++++ src/main/java/domain/Words.java | 4 ++-- src/test/java/domain/WordsTest.java | 12 ++++++------ 3 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 src/main/java/domain/CorrectAnswer.java diff --git a/src/main/java/domain/CorrectAnswer.java b/src/main/java/domain/CorrectAnswer.java new file mode 100644 index 00000000..9798fea3 --- /dev/null +++ b/src/main/java/domain/CorrectAnswer.java @@ -0,0 +1,25 @@ +package domain; + +import java.util.Objects; + +public class CorrectAnswer { + + private final Word result; + + public CorrectAnswer(Word result) { + this.result = result; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CorrectAnswer that = (CorrectAnswer) o; + return Objects.equals(result, that.result); + } + + @Override + public int hashCode() { + return Objects.hash(result); + } +} diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index 8595e458..654abba3 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -20,10 +20,10 @@ private List convert(List words) { return words.stream().map(Word::new).collect(Collectors.toList()); } - public Word getResult(LocalDate now) { + public CorrectAnswer getCorrectAnswer(LocalDate now) { long between = ChronoUnit.DAYS.between(LocalDate.of(2021, 6, 19), now); - return this.words.get((int) (between % words.size())); + return new CorrectAnswer(this.words.get((int) (between % words.size()))); } public List getWords() { diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index 8d44203f..5f8206ff 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -49,9 +49,9 @@ static Stream generateData() { void test04() { Words words = new Words(List.of("MySQL", "SLiPP", "words")); - Word word = words.getResult(LocalDate.of(2021, 6, 22)); + CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 22)); - assertThat(word).isEqualTo(new Word("MySQL")); + assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("MySQL"))); } @DisplayName("정답을 가져온다.") @@ -59,9 +59,9 @@ void test04() { void test05() { Words words = new Words(List.of("MySQL", "SLiPP", "words")); - Word word = words.getResult(LocalDate.of(2021, 6, 21)); + CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 21)); - assertThat(word).isEqualTo(new Word("words")); + assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("words"))); } @DisplayName("정답을 가져온다.") @@ -69,8 +69,8 @@ void test05() { void test06() { Words words = new Words(List.of("MySQL", "SLiPP", "words")); - Word word = words.getResult(LocalDate.of(2021, 6, 23)); + CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 23)); - assertThat(word).isEqualTo(new Word("SLiPP")); + assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("SLiPP"))); } } \ No newline at end of file From d54e1b771e7e8391f74123f07d93446fd08cdc5b Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Tue, 28 Mar 2023 21:41:32 +0900 Subject: [PATCH 12/30] =?UTF-8?q?feat:=20=EB=8B=B5=EC=95=88=EA=B3=BC=20?= =?UTF-8?q?=EC=A0=95=EB=8B=B5=EC=9D=84=20=EB=B9=84=EA=B5=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CorrectAnswer.java | 44 +++++++++-- src/main/java/domain/Tile.java | 15 ++++ src/test/java/domain/CorrectAnswerTest.java | 81 +++++++++++++++++++++ 3 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 src/main/java/domain/Tile.java create mode 100644 src/test/java/domain/CorrectAnswerTest.java diff --git a/src/main/java/domain/CorrectAnswer.java b/src/main/java/domain/CorrectAnswer.java index 9798fea3..2f7a4db4 100644 --- a/src/main/java/domain/CorrectAnswer.java +++ b/src/main/java/domain/CorrectAnswer.java @@ -1,25 +1,59 @@ package domain; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; public class CorrectAnswer { - private final Word result; + private final Word correctAnswer; - public CorrectAnswer(Word result) { - this.result = result; + public CorrectAnswer(Word correctAnswer) { + this.correctAnswer = correctAnswer; } + public List compare(Word answer) { + // 위치와 글자가 맞으면 초록색 + // 위치가 틀리고, 글자가 맞으면 노란색 + // 위치와 글자가 틀리면 회색 + List tiles = new ArrayList<>(); + + Map map = this.correctAnswer.getWord() + .chars() + .mapToObj(c -> (char) c) + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); + + for (int i = 0; i < 5; i++) { + Long count = map.get(answer.getWord().charAt(i)); + + if (Objects.isNull(count) || count == 0) { + tiles.add(Tile.GRAY); + } else { + if (this.correctAnswer.getWord().charAt(i) == answer.getWord().charAt(i)) { + tiles.add(Tile.GREEN); + } else { + tiles.add(Tile.YELLOW); + } + map.put(answer.getWord().charAt(i), count - 1); + } + } + + return tiles; + } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CorrectAnswer that = (CorrectAnswer) o; - return Objects.equals(result, that.result); + return Objects.equals(correctAnswer, that.correctAnswer); } @Override public int hashCode() { - return Objects.hash(result); + return Objects.hash(correctAnswer); } } diff --git a/src/main/java/domain/Tile.java b/src/main/java/domain/Tile.java new file mode 100644 index 00000000..42f672d9 --- /dev/null +++ b/src/main/java/domain/Tile.java @@ -0,0 +1,15 @@ +package domain; + +public enum Tile { + GREEN("\uD83D\uDFE9"), YELLOW("\uD83D\uDFE8"), GRAY("⬜"); + + private final String tile; + + Tile(String tile) { + this.tile = tile; + } + + public String getTile() { + return tile; + } +} diff --git a/src/test/java/domain/CorrectAnswerTest.java b/src/test/java/domain/CorrectAnswerTest.java new file mode 100644 index 00000000..3957ed54 --- /dev/null +++ b/src/test/java/domain/CorrectAnswerTest.java @@ -0,0 +1,81 @@ +package 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 CorrectAnswerTest { + + @DisplayName("정답을 모두 맟췄을 때 모두 초록색이 나온다.") + @Test + void test01() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("spill")); + + assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN); + } + + @DisplayName("정답을 모두 빗나갔을 때 모두 노란색이 나온다.") + @Test + void test02() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("llsip")); + + assertThat(tiles).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); + } + + @DisplayName("정답을 모두 틀렸을 때 모두 회색이 나온다.") + @Test + void test03() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("mongo")); + + assertThat(tiles).containsExactly(Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY); + } + + /*@DisplayName("그린 1개, 노란색 1개, 회색 3개인 답안을 비교한다.") + @Test + void test01() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("hello")); + + assertThat(tiles).containsExactly(Tile.GRAY, Tile.GRAY, Tile.YELLOW, Tile.GREEN, Tile.GRAY); + } + + @DisplayName("그린 1개, 노란색 1개, 회색 3개인 답안을 비교한다.") + @Test + void test02() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("label")); + + assertThat(tiles).containsExactly(Tile.YELLOW, Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GREEN); + } + + @DisplayName("입력된 답안을 존재하는 Word 인지 비교한다.") + @Test + void test03() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("spell")); + + assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GRAY, Tile.GREEN, Tile.GREEN); + } + + @DisplayName("입력된 답안을 존재하는 Word 인지 비교한다.") + @Test + void test04() { + CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + + List tiles = correctAnswer.compare(new Word("spill")); + + assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN); + }*/ +} \ No newline at end of file From efba747e2ae0c94656fe5fa0c94422919bd46a52 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Tue, 28 Mar 2023 21:41:46 +0900 Subject: [PATCH 13/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index de5c08aa..62bf59a1 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,17 @@ * Words Generator * [X] `words.txt`에서 Words 를 읽어온다. * Word - * [ ] Word 를 생성한다. - * [ ] 5글자의 알파벳만 받는다. - * [ ] 5글자가 아니면 에러를 발생한다. - * [ ] 알파벳이 아니면 에러를 발생한다. + * [x] Word 를 생성한다. + * [x] 5글자의 알파벳만 받는다. + * [x] 5글자가 아니면 에러를 발생한다. + * [x] 알파벳이 아니면 에러를 발생한다. * Words * [x] Words 를 생성한다. * [x] 주어진 Words 가 비어있으면 에러를 발생한다. * [x] 주어진 Words 에 Word 가 없다면 에러를 발생한다. - * [ ] 정답을 가져온다. - * [ ] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. + * [x] 정답을 가져온다. + * [x] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. +* 정답 * [ ] 입력된 답안을 존재하는 Word 인지 비교한다. * 답안 * [ ] 사용자가 워드를 입력한다. From d6125e74bc8785cffc4f22f6ed0cf19641a81a82 Mon Sep 17 00:00:00 2001 From: saerang Date: Thu, 30 Mar 2023 20:25:21 +0900 Subject: [PATCH 14/30] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=A6=84=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(CorrectAnswer=20->=20Answer)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{CorrectAnswer.java => Answer.java} | 6 +-- src/main/java/domain/Words.java | 8 ++-- ...CorrectAnswerTest.java => AnswerTest.java} | 14 +++---- src/test/java/domain/WordsTest.java | 39 ++++++++----------- 4 files changed, 32 insertions(+), 35 deletions(-) rename src/main/java/domain/{CorrectAnswer.java => Answer.java} (92%) rename src/test/java/domain/{CorrectAnswerTest.java => AnswerTest.java} (83%) diff --git a/src/main/java/domain/CorrectAnswer.java b/src/main/java/domain/Answer.java similarity index 92% rename from src/main/java/domain/CorrectAnswer.java rename to src/main/java/domain/Answer.java index 2f7a4db4..2b2480d7 100644 --- a/src/main/java/domain/CorrectAnswer.java +++ b/src/main/java/domain/Answer.java @@ -6,11 +6,11 @@ import java.util.Objects; import java.util.stream.Collectors; -public class CorrectAnswer { +public class Answer { private final Word correctAnswer; - public CorrectAnswer(Word correctAnswer) { + public Answer(Word correctAnswer) { this.correctAnswer = correctAnswer; } @@ -48,7 +48,7 @@ public List compare(Word answer) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - CorrectAnswer that = (CorrectAnswer) o; + Answer that = (Answer) o; return Objects.equals(correctAnswer, that.correctAnswer); } diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index 654abba3..c92d8745 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; public class Words { + public static final LocalDate DEFAULT_DATE = LocalDate.of(2021, 6, 19); private final List words; public Words(List words) { @@ -20,10 +21,11 @@ private List convert(List words) { return words.stream().map(Word::new).collect(Collectors.toList()); } - public CorrectAnswer getCorrectAnswer(LocalDate now) { - long between = ChronoUnit.DAYS.between(LocalDate.of(2021, 6, 19), now); + public Answer getAnswer(LocalDate now) { + long betweenDay = ChronoUnit.DAYS.between(DEFAULT_DATE, now); - return new CorrectAnswer(this.words.get((int) (between % words.size()))); + Word answer = this.words.get((int) (betweenDay % words.size())); + return new Answer(answer); } public List getWords() { diff --git a/src/test/java/domain/CorrectAnswerTest.java b/src/test/java/domain/AnswerTest.java similarity index 83% rename from src/test/java/domain/CorrectAnswerTest.java rename to src/test/java/domain/AnswerTest.java index 3957ed54..2324fc65 100644 --- a/src/test/java/domain/CorrectAnswerTest.java +++ b/src/test/java/domain/AnswerTest.java @@ -7,14 +7,14 @@ import static org.assertj.core.api.Assertions.assertThat; -class CorrectAnswerTest { +class AnswerTest { @DisplayName("정답을 모두 맟췄을 때 모두 초록색이 나온다.") @Test void test01() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + Answer answer = new Answer(new Word("spill")); - List tiles = correctAnswer.compare(new Word("spill")); + List tiles = answer.compare(new Word("spill")); assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN); } @@ -22,9 +22,9 @@ void test01() { @DisplayName("정답을 모두 빗나갔을 때 모두 노란색이 나온다.") @Test void test02() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + Answer answer = new Answer(new Word("spill")); - List tiles = correctAnswer.compare(new Word("llsip")); + List tiles = answer.compare(new Word("llsip")); assertThat(tiles).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); } @@ -32,9 +32,9 @@ void test02() { @DisplayName("정답을 모두 틀렸을 때 모두 회색이 나온다.") @Test void test03() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); + Answer answer = new Answer(new Word("spill")); - List tiles = correctAnswer.compare(new Word("mongo")); + List tiles = answer.compare(new Word("mongo")); assertThat(tiles).containsExactly(Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY); } diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index 5f8206ff..ed49ad49 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -44,33 +44,28 @@ static Stream generateData() { Arguments.of(List.of("12345", "a1234"))); } - @DisplayName("정답을 가져온다.") - @Test - void test04() { - Words words = new Words(List.of("MySQL", "SLiPP", "words")); + @DisplayName("words 정답을 가져온다.") + @ParameterizedTest + @MethodSource("generateAnswerData") + void test04(LocalDate now, String result) { + Words words = new Words(List.of("MySQL", "SLiPP", "Words")); - CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 22)); + Answer answer = words.getAnswer(now); - assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("MySQL"))); + assertThat(answer).isEqualTo(getAnswer(result)); } - @DisplayName("정답을 가져온다.") - @Test - void test05() { - Words words = new Words(List.of("MySQL", "SLiPP", "words")); - - CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 21)); - - assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("words"))); + static Stream generateAnswerData() { + return Stream.of( + Arguments.of(Words.DEFAULT_DATE.plusDays(0), "MySQL"), + Arguments.of(Words.DEFAULT_DATE.plusDays(1), "SLiPP"), + Arguments.of(Words.DEFAULT_DATE.plusDays(2), "Words"), + Arguments.of(Words.DEFAULT_DATE.plusDays(3), "MySQL"), + Arguments.of(Words.DEFAULT_DATE.plusDays(4), "SLiPP") + ); } - @DisplayName("정답을 가져온다.") - @Test - void test06() { - Words words = new Words(List.of("MySQL", "SLiPP", "words")); - - CorrectAnswer correctAnswer = words.getCorrectAnswer(LocalDate.of(2021, 6, 23)); - - assertThat(correctAnswer).isEqualTo(new CorrectAnswer(new Word("SLiPP"))); + private static Answer getAnswer(String result) { + return new Answer(new Word(result)); } } \ No newline at end of file From 995484769755517325d9ed35c449b4b91ebd9068 Mon Sep 17 00:00:00 2001 From: saerang Date: Thu, 30 Mar 2023 20:55:09 +0900 Subject: [PATCH 15/30] =?UTF-8?q?feat:=20Letter=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Letter.java | 43 ++++++++++++++++++++++++++++ src/test/java/domain/LetterTest.java | 23 +++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/domain/Letter.java create mode 100644 src/test/java/domain/LetterTest.java diff --git a/src/main/java/domain/Letter.java b/src/main/java/domain/Letter.java new file mode 100644 index 00000000..4d810db6 --- /dev/null +++ b/src/main/java/domain/Letter.java @@ -0,0 +1,43 @@ +package domain; + +import java.util.Objects; + +public class Letter { + private final String letter; + + public Letter(Character letter) { + if (this.isNotAlphabet(letter)) { + throw new IllegalArgumentException(letter + "는 알파벳이 아닙니다."); + } + + this.letter = String.valueOf(letter); + } + + private boolean isNotAlphabet(Character letter) { + return !(letter >= 'A' && letter <= 'Z') && !(letter >= 'a' && letter <= 'z'); + } + + public String getLetter() { + return letter; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Letter letter1 = (Letter) o; + return Objects.equals(letter, letter1.letter); + } + + @Override + public int hashCode() { + return Objects.hash(letter); + } + + @Override + public String toString() { + return "Letter{" + + "letter='" + letter + '\'' + + '}'; + } +} diff --git a/src/test/java/domain/LetterTest.java b/src/test/java/domain/LetterTest.java new file mode 100644 index 00000000..26b8700c --- /dev/null +++ b/src/test/java/domain/LetterTest.java @@ -0,0 +1,23 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +class LetterTest { + + @DisplayName("Letter 을 생성한다.") + @Test + void test01() { + Letter letter = new Letter('A'); + + assertThat(letter.getLetter()).isEqualTo("A"); + } + + @DisplayName("Letter 에 숫자가 들어가면 에러가 발생한다.") + @Test + void test02() { + assertThatThrownBy(() -> new Letter('1')).isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From bfe943a16eeb5a8a7614f282869fe25c08ca44f4 Mon Sep 17 00:00:00 2001 From: saerang Date: Thu, 30 Mar 2023 21:06:43 +0900 Subject: [PATCH 16/30] =?UTF-8?q?refactor:=20Answer,=20Word=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Letter=20=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=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 --- src/main/java/domain/Answer.java | 23 +++++++++++------------ src/main/java/domain/Word.java | 16 +++++++++------- src/test/java/domain/WordTest.java | 12 ++++++++++-- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index 2b2480d7..555c184b 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -8,10 +8,10 @@ public class Answer { - private final Word correctAnswer; + private final Word answer; - public Answer(Word correctAnswer) { - this.correctAnswer = correctAnswer; + public Answer(Word answer) { + this.answer = answer; } public List compare(Word answer) { @@ -20,23 +20,22 @@ public List compare(Word answer) { // 위치와 글자가 틀리면 회색 List tiles = new ArrayList<>(); - Map map = this.correctAnswer.getWord() - .chars() - .mapToObj(c -> (char) c) - .collect(Collectors.groupingBy(c -> c, Collectors.counting())); + Map letterMap = this.answer.getWord() + .stream() + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); for (int i = 0; i < 5; i++) { - Long count = map.get(answer.getWord().charAt(i)); + Long count = letterMap.get(answer.getWord().get(i)); if (Objects.isNull(count) || count == 0) { tiles.add(Tile.GRAY); } else { - if (this.correctAnswer.getWord().charAt(i) == answer.getWord().charAt(i)) { + if (this.answer.getWord().get(i).equals(answer.getWord().get(i))) { tiles.add(Tile.GREEN); } else { tiles.add(Tile.YELLOW); } - map.put(answer.getWord().charAt(i), count - 1); + letterMap.put(answer.getWord().get(i), count - 1); } } @@ -49,11 +48,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Answer that = (Answer) o; - return Objects.equals(correctAnswer, that.correctAnswer); + return Objects.equals(answer, that.answer); } @Override public int hashCode() { - return Objects.hash(correctAnswer); + return Objects.hash(answer); } } diff --git a/src/main/java/domain/Word.java b/src/main/java/domain/Word.java index 2f088fe4..3f8c743f 100644 --- a/src/main/java/domain/Word.java +++ b/src/main/java/domain/Word.java @@ -1,27 +1,29 @@ package domain; +import java.util.List; import java.util.Objects; -import java.util.regex.Pattern; +import java.util.stream.Collectors; public class Word { public static final int WORD_LENGTH = 5; - private static final Pattern pattern = Pattern.compile("^[a-zA-Z]*"); - private final String word; + private final List word; public Word(String word) { if (this.isNotMatchWord(word)) { throw new IllegalArgumentException(word + "는 5글자의 알파벳이 아닙니다."); } - this.word = word; + this.word = word.chars().mapToObj(c -> (char) c) + .map(Letter::new) + .collect(Collectors.toList()); } private boolean isNotMatchWord(String word){ - return word.length() != WORD_LENGTH || !pattern.matcher(word).matches(); + return word.length() != WORD_LENGTH; } - public String getWord() { + public List getWord() { return word; } @@ -41,7 +43,7 @@ public int hashCode() { @Override public String toString() { return "Word{" + - "word='" + word + '\'' + + "word=" + word + '}'; } } diff --git a/src/test/java/domain/WordTest.java b/src/test/java/domain/WordTest.java index 51f2d9ab..0a2c3407 100644 --- a/src/test/java/domain/WordTest.java +++ b/src/test/java/domain/WordTest.java @@ -1,9 +1,11 @@ package domain; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.stream.Collectors; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -14,7 +16,7 @@ class WordTest { void test01() { Word word = new Word("SLiPP"); - assertThat(word.getWord()).isEqualTo("SLiPP"); + assertThat(word.getWord()).isEqualTo(getLetters("SLiPP")); } @DisplayName("Word 가 5글자가 아니면 에러를 발생한다.") @@ -30,4 +32,10 @@ void test03() { assertThatThrownBy(() -> new Word("12345")) .isInstanceOf(IllegalArgumentException.class); } + + public List getLetters(String word) { + return word.chars().mapToObj(c -> (char) c) + .map(Letter::new) + .collect(Collectors.toList()); + } } \ No newline at end of file From cac009b14ae238d9efadf98c53637355a39b3dd4 Mon Sep 17 00:00:00 2001 From: saerang Date: Thu, 30 Mar 2023 21:08:22 +0900 Subject: [PATCH 17/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 62bf59a1..49d9f313 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # 미션 - 워들 ## 기능 요구 사항 +* Letter + * [x] Letter 를 생성한다. + * [x] 알파벳만 입력 가능하다. + * [x] 알파벳이 아니면 에러를 발생한다. * Words Generator * [X] `words.txt`에서 Words 를 읽어온다. * Word @@ -14,7 +18,7 @@ * [x] 정답을 가져온다. * [x] ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어를 가져온다. * 정답 - * [ ] 입력된 답안을 존재하는 Word 인지 비교한다. + * [x] 입력된 답안을 존재하는 Word 인지 비교한다. * 답안 * [ ] 사용자가 워드를 입력한다. * [ ] 글자는 5글자까지 입력 가능하다. From 13f908cb70f82042b999fd7b451da56407c07918 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Fri, 31 Mar 2023 20:11:14 +0900 Subject: [PATCH 18/30] =?UTF-8?q?refactor:=20=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Answer.java | 56 +++++++++++++++++++------------- src/main/java/domain/Tile.java | 4 +-- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index 555c184b..be8f0df8 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -10,38 +10,48 @@ public class Answer { private final Word answer; + private final Map letterMap; + public Answer(Word answer) { + this.answer = answer; + this.letterMap = answer.getWord() + .stream() + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); } public List compare(Word answer) { - // 위치와 글자가 맞으면 초록색 - // 위치가 틀리고, 글자가 맞으면 노란색 - // 위치와 글자가 틀리면 회색 - List tiles = new ArrayList<>(); - - Map letterMap = this.answer.getWord() - .stream() - .collect(Collectors.groupingBy(c -> c, Collectors.counting())); - - for (int i = 0; i < 5; i++) { - Long count = letterMap.get(answer.getWord().get(i)); - - if (Objects.isNull(count) || count == 0) { - tiles.add(Tile.GRAY); - } else { - if (this.answer.getWord().get(i).equals(answer.getWord().get(i))) { - tiles.add(Tile.GREEN); - } else { - tiles.add(Tile.YELLOW); - } - letterMap.put(answer.getWord().get(i), count - 1); - } + List result = new ArrayList<>(); + + for (int i = 0; i < Word.WORD_LENGTH; i++) { + Letter inputLetter = answer.getWord().get(i); + Letter answerLetter = this.answer.getWord().get(i); + Long count = letterMap.get(inputLetter); + + Tile tile = getTile(count, answerLetter, inputLetter); + result.add(tile); + + decreaseCountIfAnswerCorrect(tile, inputLetter, count); } - return tiles; + return result; } + private void decreaseCountIfAnswerCorrect(Tile tile, Letter inputLetter, Long count) { + if (tile.isNotWrong()) { + letterMap.put(inputLetter, count - 1); + } + } + + private Tile getTile(Long count, Letter answerLetter, Letter letter) { + if (count == null || count == 0) { + return Tile.GRAY; + } + if (answerLetter.equals(letter)) { + return Tile.GREEN; + } + return Tile.YELLOW; + } @Override public boolean equals(Object o) { diff --git a/src/main/java/domain/Tile.java b/src/main/java/domain/Tile.java index 42f672d9..7c9e3e45 100644 --- a/src/main/java/domain/Tile.java +++ b/src/main/java/domain/Tile.java @@ -9,7 +9,7 @@ public enum Tile { this.tile = tile; } - public String getTile() { - return tile; + public boolean isNotWrong() { + return this != GRAY; } } From c8b37fa373a2c33c25af91198152c9eaef0fd9df Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Fri, 31 Mar 2023 20:41:23 +0900 Subject: [PATCH 19/30] =?UTF-8?q?feat:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Answer.java | 1 - src/main/java/domain/Tile.java | 4 ++++ src/main/java/dto/GameHistory.java | 20 ++++++++++++++++++++ src/main/java/view/InputView.java | 24 ++++++++++++++++++++++++ src/main/java/view/OutputView.java | 18 ++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dto/GameHistory.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index be8f0df8..26f351da 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -13,7 +13,6 @@ public class Answer { private final Map letterMap; public Answer(Word answer) { - this.answer = answer; this.letterMap = answer.getWord() .stream() diff --git a/src/main/java/domain/Tile.java b/src/main/java/domain/Tile.java index 7c9e3e45..5d4126a7 100644 --- a/src/main/java/domain/Tile.java +++ b/src/main/java/domain/Tile.java @@ -12,4 +12,8 @@ public enum Tile { public boolean isNotWrong() { return this != GRAY; } + + public String getTile() { + return tile; + } } diff --git a/src/main/java/dto/GameHistory.java b/src/main/java/dto/GameHistory.java new file mode 100644 index 00000000..31567ba1 --- /dev/null +++ b/src/main/java/dto/GameHistory.java @@ -0,0 +1,20 @@ +package dto; + +import domain.Tile; + +import java.util.List; +import java.util.stream.Collectors; + +public class GameHistory { + + private final List gameHistory; + + public GameHistory(List gameHistory) { + this.gameHistory = gameHistory; + } + + public String getGameResult() { + return gameHistory.stream().map(Tile::getTile) + .collect(Collectors.joining()); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..b16e7d2d --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,24 @@ +package view; + +import java.util.Scanner; + +public class InputView { + + public static final int GAME_TOTAL_ROUND = 6; + + private static final String INPUT_START_GAME_MESSAGE + = String.format("WORDLE을 %d번 만에 맞춰 보세요.\n시도의 결과는 타일의 색 변화로 나타납니다.", GAME_TOTAL_ROUND); + + private static final String INPUT_WORD_MESSAGE = "정답을 입력해주세요."; + + private static final Scanner scanner = new Scanner(System.in); + + public static void inputStartGame() { + System.out.println(INPUT_START_GAME_MESSAGE); + } + + public static String inputWord() { + System.out.println(INPUT_WORD_MESSAGE); + return scanner.nextLine(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..28589141 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,18 @@ +package view; + +import dto.GameHistory; + +import java.util.List; + +public class OutputView { + + public static void outputTiles(List gameHistories) { + gameHistories.forEach(gameHistory -> System.out.println(gameHistory.getGameResult())); + System.out.println(); + } + + public static void outputEndGame(List gameHistories) { + System.out.println(gameHistories.size() + "/" + InputView.GAME_TOTAL_ROUND); + outputTiles(gameHistories); + } +} From 5c5daebf5b3f5b26a5156fefe2e6818dbc867fe1 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Fri, 31 Mar 2023 21:31:57 +0900 Subject: [PATCH 20/30] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EC=A1=B0?= =?UTF-8?q?=EB=A6=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 9 ++++ src/main/java/config/FileConfig.java | 2 +- src/main/java/controller/GameController.java | 45 ++++++++++++++++ src/main/java/domain/Answer.java | 54 ++++++++++++++------ src/main/java/service/GameService.java | 5 ++ src/test/java/domain/AnswerTest.java | 12 +++++ 6 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/controller/GameController.java create mode 100644 src/main/java/service/GameService.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..573f588f --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,9 @@ +import controller.GameController; +import service.GameService; + +public class Application { + public static void main(String[] args) { + GameController gameController = new GameController(new GameService()); + gameController.start(); + } +} diff --git a/src/main/java/config/FileConfig.java b/src/main/java/config/FileConfig.java index c1a5351d..9aadd746 100644 --- a/src/main/java/config/FileConfig.java +++ b/src/main/java/config/FileConfig.java @@ -2,5 +2,5 @@ public class FileConfig { - private final static String FILE_PATH = "src/main/resources/words.txt"; + public final static String FILE_PATH = "src/main/resources/words.txt"; } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 00000000..bb991d0d --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,45 @@ +package controller; + +import config.FileConfig; +import domain.Answer; +import domain.Tile; +import domain.Word; +import domain.Words; +import dto.GameHistory; +import service.GameService; +import support.WordsGenerator; +import view.InputView; +import view.OutputView; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class GameController { + + private final GameService gameService; + + private final List gameHistories = new ArrayList<>(); + + public GameController(GameService gameService) { + this.gameService = gameService; + } + + public void start() { + Words words = new Words(WordsGenerator.read(FileConfig.FILE_PATH)); + Answer answer = words.getAnswer(LocalDate.now()); + InputView.inputStartGame(); // heart + for (int i = 0; i < InputView.GAME_TOTAL_ROUND; i++) { + Word inputWord = new Word(InputView.inputWord()); + System.out.println("answer: " + answer); + System.out.println("inputWord: " + inputWord); + List tiles = answer.compare(inputWord); + gameHistories.add(new GameHistory(tiles)); + if (answer.isSuccess() || InputView.GAME_TOTAL_ROUND == i) { + break; + } + OutputView.outputTiles(gameHistories); + } + OutputView.outputEndGame(gameHistories); + } +} diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index 26f351da..bce11c62 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -1,49 +1,58 @@ package domain; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; public class Answer { private final Word answer; - private final Map letterMap; + private boolean isSuccess = false; public Answer(Word answer) { this.answer = answer; - this.letterMap = answer.getWord() - .stream() - .collect(Collectors.groupingBy(c -> c, Collectors.counting())); } public List compare(Word answer) { + Map letterMap = getLetterMap(); + List result = new ArrayList<>(); for (int i = 0; i < Word.WORD_LENGTH; i++) { - Letter inputLetter = answer.getWord().get(i); - Letter answerLetter = this.answer.getWord().get(i); - Long count = letterMap.get(inputLetter); + Long count = letterMap.get(answer.getWord().get(i)); - Tile tile = getTile(count, answerLetter, inputLetter); + Tile tile = getTile(count, this.answer.getWord().get(i), answer.getWord().get(i)); result.add(tile); - decreaseCountIfAnswerCorrect(tile, inputLetter, count); + letterMap.put(answer.getWord().get(i), letterMap.getOrDefault(answer.getWord().get(i), 0L) - 1); } + endGame(result); return result; } - private void decreaseCountIfAnswerCorrect(Tile tile, Letter inputLetter, Long count) { - if (tile.isNotWrong()) { - letterMap.put(inputLetter, count - 1); + private Map getLetterMap() { + return this.answer.getWord() + .stream() + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); + } + + private void endGame(List result) { + int count = Collections.frequency(result, Tile.GREEN); + + if (count == Word.WORD_LENGTH) { + this.isSuccess = true; } } +// private void decreaseCountIfAnswerCorrect(Tile tile, Letter inputLetter, Long count) { +// if (tile.isNotWrong()) { +// letterMap.put(inputLetter, count - 1); +// } +// } + private Tile getTile(Long count, Letter answerLetter, Letter letter) { - if (count == null || count == 0) { + if (count == null || count <= 0) { return Tile.GRAY; } if (answerLetter.equals(letter)) { @@ -52,6 +61,10 @@ private Tile getTile(Long count, Letter answerLetter, Letter letter) { return Tile.YELLOW; } + public boolean isSuccess() { + return isSuccess; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -64,4 +77,11 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(answer); } + + @Override + public String toString() { + return "Answer{" + + "answer=" + answer + + '}'; + } } diff --git a/src/main/java/service/GameService.java b/src/main/java/service/GameService.java new file mode 100644 index 00000000..4d549a6c --- /dev/null +++ b/src/main/java/service/GameService.java @@ -0,0 +1,5 @@ +package service; + +public class GameService { + +} diff --git a/src/test/java/domain/AnswerTest.java b/src/test/java/domain/AnswerTest.java index 2324fc65..1ef88875 100644 --- a/src/test/java/domain/AnswerTest.java +++ b/src/test/java/domain/AnswerTest.java @@ -39,6 +39,18 @@ void test03() { assertThat(tiles).containsExactly(Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GRAY); } + @DisplayName("두 번 호출 시 동일한 값이 나온다.") + @Test + void test04() { + Answer answer = new Answer(new Word("spill")); + + List tiles1 = answer.compare(new Word("llsip")); + assertThat(tiles1).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); + // 실패발생 + List tiles2 = answer.compare(new Word("llsip")); + assertThat(tiles2).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); + } + /*@DisplayName("그린 1개, 노란색 1개, 회색 3개인 답안을 비교한다.") @Test void test01() { From 1fc94126b1d28e1506b1f8fb00bda2eddd32e879 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Fri, 31 Mar 2023 22:18:45 +0900 Subject: [PATCH 21/30] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 29 ++----------- src/main/java/domain/Answer.java | 6 --- src/main/java/domain/Tile.java | 4 -- src/main/java/service/GameService.java | 44 ++++++++++++++++++++ 4 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index bb991d0d..0e94547e 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,45 +1,22 @@ package controller; -import config.FileConfig; import domain.Answer; -import domain.Tile; -import domain.Word; -import domain.Words; import dto.GameHistory; import service.GameService; -import support.WordsGenerator; -import view.InputView; -import view.OutputView; -import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; public class GameController { private final GameService gameService; - private final List gameHistories = new ArrayList<>(); - public GameController(GameService gameService) { this.gameService = gameService; } public void start() { - Words words = new Words(WordsGenerator.read(FileConfig.FILE_PATH)); - Answer answer = words.getAnswer(LocalDate.now()); - InputView.inputStartGame(); // heart - for (int i = 0; i < InputView.GAME_TOTAL_ROUND; i++) { - Word inputWord = new Word(InputView.inputWord()); - System.out.println("answer: " + answer); - System.out.println("inputWord: " + inputWord); - List tiles = answer.compare(inputWord); - gameHistories.add(new GameHistory(tiles)); - if (answer.isSuccess() || InputView.GAME_TOTAL_ROUND == i) { - break; - } - OutputView.outputTiles(gameHistories); - } - OutputView.outputEndGame(gameHistories); + Answer answer = gameService.init(); + List gameHistories = gameService.startGame(answer); + gameService.endGame(gameHistories); } } diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index bce11c62..61d19741 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -45,12 +45,6 @@ private void endGame(List result) { } } -// private void decreaseCountIfAnswerCorrect(Tile tile, Letter inputLetter, Long count) { -// if (tile.isNotWrong()) { -// letterMap.put(inputLetter, count - 1); -// } -// } - private Tile getTile(Long count, Letter answerLetter, Letter letter) { if (count == null || count <= 0) { return Tile.GRAY; diff --git a/src/main/java/domain/Tile.java b/src/main/java/domain/Tile.java index 5d4126a7..42f672d9 100644 --- a/src/main/java/domain/Tile.java +++ b/src/main/java/domain/Tile.java @@ -9,10 +9,6 @@ public enum Tile { this.tile = tile; } - public boolean isNotWrong() { - return this != GRAY; - } - public String getTile() { return tile; } diff --git a/src/main/java/service/GameService.java b/src/main/java/service/GameService.java index 4d549a6c..df118262 100644 --- a/src/main/java/service/GameService.java +++ b/src/main/java/service/GameService.java @@ -1,5 +1,49 @@ package service; +import config.FileConfig; +import domain.Answer; +import domain.Tile; +import domain.Word; +import domain.Words; +import dto.GameHistory; +import support.WordsGenerator; +import view.InputView; +import view.OutputView; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + public class GameService { + public Answer init() { + InputView.inputStartGame(); + Words words = new Words(WordsGenerator.read(FileConfig.FILE_PATH)); + return words.getAnswer(LocalDate.now()); + } + + public List startGame(Answer answer) { + List gameHistories = new ArrayList<>(); + + int count = 0; + while (count < InputView.GAME_TOTAL_ROUND && !answer.isSuccess()) { + Word inputWord = new Word(InputView.inputWord()); + List tiles = answer.compare(inputWord); + gameHistories.add(new GameHistory(tiles)); + print(answer, gameHistories); + count++; + } + + return gameHistories; + } + + private void print(Answer answer, List gameHistories) { + if (!answer.isSuccess()) { + OutputView.outputTiles(gameHistories); + } + } + + public void endGame(List gameHistories) { + OutputView.outputEndGame(gameHistories); + } } From 154b2891262cb2c81ff2786e4e96aa7c0a3385bb Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 14:10:54 +0900 Subject: [PATCH 22/30] =?UTF-8?q?refactor:=20while=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EB=AC=B8=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/service/GameService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/GameService.java b/src/main/java/service/GameService.java index df118262..16c199ef 100644 --- a/src/main/java/service/GameService.java +++ b/src/main/java/service/GameService.java @@ -26,7 +26,7 @@ public List startGame(Answer answer) { List gameHistories = new ArrayList<>(); int count = 0; - while (count < InputView.GAME_TOTAL_ROUND && !answer.isSuccess()) { + while (isRound(answer, count)) { Word inputWord = new Word(InputView.inputWord()); List tiles = answer.compare(inputWord); gameHistories.add(new GameHistory(tiles)); @@ -37,6 +37,10 @@ public List startGame(Answer answer) { return gameHistories; } + private static boolean isRound(Answer answer, int count) { + return count < InputView.GAME_TOTAL_ROUND && !answer.isSuccess(); + } + private void print(Answer answer, List gameHistories) { if (!answer.isSuccess()) { OutputView.outputTiles(gameHistories); From 0133dd729b51f28967a832a2ac11b2dceb0d4b08 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 15:16:16 +0900 Subject: [PATCH 23/30] =?UTF-8?q?refactor:=20=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Answer.java | 12 +-------- src/main/java/domain/Tile.java | 10 ++++++++ src/test/java/domain/TileTest.java | 39 ++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 src/test/java/domain/TileTest.java diff --git a/src/main/java/domain/Answer.java b/src/main/java/domain/Answer.java index 61d19741..2e229b78 100644 --- a/src/main/java/domain/Answer.java +++ b/src/main/java/domain/Answer.java @@ -21,7 +21,7 @@ public List compare(Word answer) { for (int i = 0; i < Word.WORD_LENGTH; i++) { Long count = letterMap.get(answer.getWord().get(i)); - Tile tile = getTile(count, this.answer.getWord().get(i), answer.getWord().get(i)); + Tile tile = Tile.getTile(count, this.answer.getWord().get(i), answer.getWord().get(i)); result.add(tile); letterMap.put(answer.getWord().get(i), letterMap.getOrDefault(answer.getWord().get(i), 0L) - 1); @@ -45,16 +45,6 @@ private void endGame(List result) { } } - private Tile getTile(Long count, Letter answerLetter, Letter letter) { - if (count == null || count <= 0) { - return Tile.GRAY; - } - if (answerLetter.equals(letter)) { - return Tile.GREEN; - } - return Tile.YELLOW; - } - public boolean isSuccess() { return isSuccess; } diff --git a/src/main/java/domain/Tile.java b/src/main/java/domain/Tile.java index 42f672d9..38cbb764 100644 --- a/src/main/java/domain/Tile.java +++ b/src/main/java/domain/Tile.java @@ -12,4 +12,14 @@ public enum Tile { public String getTile() { return tile; } + + public static Tile getTile(Long count, Letter answerLetter, Letter letter) { + if (count == null || count <= 0) { + return Tile.GRAY; + } + if (answerLetter.equals(letter)) { + return Tile.GREEN; + } + return Tile.YELLOW; + } } diff --git a/src/test/java/domain/TileTest.java b/src/test/java/domain/TileTest.java new file mode 100644 index 00000000..ebfc40bb --- /dev/null +++ b/src/test/java/domain/TileTest.java @@ -0,0 +1,39 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class TileTest { + + @DisplayName("답안과 정답의 글자가 동일하고 워드에 들어있는 동일한 글자의 합계가 1이상이면 초록색 타일을 반환한다.") + @Test + void test01() { + Long count = 1L; + Letter answerLetter = new Letter('I'); + Letter letter = new Letter('I'); + + assertThat(Tile.getTile(count, answerLetter, letter)).isEqualTo(Tile.GREEN); + } + + @DisplayName("답안과 정답이 동일하지 않고 워드에 들어있는 동일한 글자의 합계가 1이상이면 노란색 타일을 반환한다.") + @Test + void test02() { + Long count = 1L; + Letter answerLetter = new Letter('I'); + Letter letter = new Letter('E'); + + assertThat(Tile.getTile(count, answerLetter, letter)).isEqualTo(Tile.YELLOW); + } + + @DisplayName("워드에 들어있는 동일한 글자의 합계가 0 또는 빈 값이면 회색 타일을 반환한다.") + @Test + void test03() { + Long count = 0L; + Letter answerLetter = new Letter('I'); + Letter letter = new Letter('I'); + + assertThat(Tile.getTile(count, answerLetter, letter)).isEqualTo(Tile.GRAY); + } +} From a724947aa2f93dc7d5813d780e12a3d310933b63 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 15:23:40 +0900 Subject: [PATCH 24/30] =?UTF-8?q?refactor:=20=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Word.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/Word.java b/src/main/java/domain/Word.java index 3f8c743f..f321064d 100644 --- a/src/main/java/domain/Word.java +++ b/src/main/java/domain/Word.java @@ -10,15 +10,19 @@ public class Word { private final List word; public Word(String word) { - if (this.isNotMatchWord(word)) { - throw new IllegalArgumentException(word + "는 5글자의 알파벳이 아닙니다."); - } + validate(word); this.word = word.chars().mapToObj(c -> (char) c) .map(Letter::new) .collect(Collectors.toList()); } + public void validate(String word) { + if (this.isNotMatchWord(word)) { + throw new IllegalArgumentException(word + "는 5글자의 알파벳이 아닙니다."); + } + } + private boolean isNotMatchWord(String word){ return word.length() != WORD_LENGTH; } From 4c1357ff702b36073fa27330705938555985248e Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 15:36:26 +0900 Subject: [PATCH 25/30] =?UTF-8?q?refactor:=20WordsGenerator=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EC=9E=90=EB=A5=BC=20=ED=86=B5=ED=95=B4=EC=84=9C=20=EC=99=B8?= =?UTF-8?q?=EB=B6=80=20=EC=83=9D=EC=84=B1=20=EB=A7=89=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/support/WordsGenerator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/support/WordsGenerator.java b/src/main/java/support/WordsGenerator.java index 4fb89191..3570af60 100644 --- a/src/main/java/support/WordsGenerator.java +++ b/src/main/java/support/WordsGenerator.java @@ -7,6 +7,9 @@ public class WordsGenerator { + private WordsGenerator() { + } + public static List read(String filePath) { try { return Files.readAllLines(Paths.get(filePath)); From 072dd4634ed1e6fb6c871235663c5c8d0f95e1f4 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 15:42:18 +0900 Subject: [PATCH 26/30] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/AnswerTest.java | 42 +--------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/src/test/java/domain/AnswerTest.java b/src/test/java/domain/AnswerTest.java index 1ef88875..67a86afc 100644 --- a/src/test/java/domain/AnswerTest.java +++ b/src/test/java/domain/AnswerTest.java @@ -46,48 +46,8 @@ void test04() { List tiles1 = answer.compare(new Word("llsip")); assertThat(tiles1).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); - // 실패발생 + List tiles2 = answer.compare(new Word("llsip")); assertThat(tiles2).containsExactly(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.YELLOW); } - - /*@DisplayName("그린 1개, 노란색 1개, 회색 3개인 답안을 비교한다.") - @Test - void test01() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); - - List tiles = correctAnswer.compare(new Word("hello")); - - assertThat(tiles).containsExactly(Tile.GRAY, Tile.GRAY, Tile.YELLOW, Tile.GREEN, Tile.GRAY); - } - - @DisplayName("그린 1개, 노란색 1개, 회색 3개인 답안을 비교한다.") - @Test - void test02() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); - - List tiles = correctAnswer.compare(new Word("label")); - - assertThat(tiles).containsExactly(Tile.YELLOW, Tile.GRAY, Tile.GRAY, Tile.GRAY, Tile.GREEN); - } - - @DisplayName("입력된 답안을 존재하는 Word 인지 비교한다.") - @Test - void test03() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); - - List tiles = correctAnswer.compare(new Word("spell")); - - assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GRAY, Tile.GREEN, Tile.GREEN); - } - - @DisplayName("입력된 답안을 존재하는 Word 인지 비교한다.") - @Test - void test04() { - CorrectAnswer correctAnswer = new CorrectAnswer(new Word("spill")); - - List tiles = correctAnswer.compare(new Word("spill")); - - assertThat(tiles).containsExactly(Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN, Tile.GREEN); - }*/ } \ No newline at end of file From 4b03b1b4523d739aee0df785188341a1460e0481 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 15:51:25 +0900 Subject: [PATCH 27/30] =?UTF-8?q?refactor:=20=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A0=91=EA=B7=BC=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/WordTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/domain/WordTest.java b/src/test/java/domain/WordTest.java index 0a2c3407..2776fde1 100644 --- a/src/test/java/domain/WordTest.java +++ b/src/test/java/domain/WordTest.java @@ -33,7 +33,7 @@ void test03() { .isInstanceOf(IllegalArgumentException.class); } - public List getLetters(String word) { + private List getLetters(String word) { return word.chars().mapToObj(c -> (char) c) .map(Letter::new) .collect(Collectors.toList()); From 91199da8bcb2ec28a9882e17d471e8b9da40912e Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 16:02:22 +0900 Subject: [PATCH 28/30] =?UTF-8?q?refactor:=20=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=BC=80=EC=9D=B4=EC=8A=A4=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/domain/WordTest.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/test/java/domain/WordTest.java b/src/test/java/domain/WordTest.java index 2776fde1..2e8d9ded 100644 --- a/src/test/java/domain/WordTest.java +++ b/src/test/java/domain/WordTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.util.List; import java.util.stream.Collectors; @@ -20,16 +22,18 @@ void test01() { } @DisplayName("Word 가 5글자가 아니면 에러를 발생한다.") - @Test - void test02() { - assertThatThrownBy(() -> new Word("Real")) + @ParameterizedTest + @ValueSource(strings = { "real", "winter" }) + void test02(String word) { + assertThatThrownBy(() -> new Word(word)) .isInstanceOf(IllegalArgumentException.class); } @DisplayName("Word 가 알파벳이 아니면 에러를 발생한다.") - @Test - void test03() { - assertThatThrownBy(() -> new Word("12345")) + @ParameterizedTest + @ValueSource(strings = { "12345", "!@#$%", "1a2bc", "s!l@i", "1!a@3" }) + void test03(String word) { + assertThatThrownBy(() -> new Word(word)) .isInstanceOf(IllegalArgumentException.class); } From 0464ddb34e6fd04bec654a25c59067f00c109599 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 17:10:37 +0900 Subject: [PATCH 29/30] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EB=8B=B5=EC=95=88=EC=9D=80=20words.txt=EC=97=90=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=95=98=EB=8A=94=20=EB=8B=A8=EC=96=B4=EB=A7=8C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B0=80=EB=8A=A5=ED=95=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 6 ++++-- src/main/java/domain/Words.java | 12 ++++++++++++ src/main/java/service/GameService.java | 10 +++++----- src/test/java/domain/WordsTest.java | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 0e94547e..4e5d5eb2 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,9 +1,11 @@ package controller; import domain.Answer; +import domain.Words; import dto.GameHistory; import service.GameService; +import java.time.LocalDate; import java.util.List; public class GameController { @@ -15,8 +17,8 @@ public GameController(GameService gameService) { } public void start() { - Answer answer = gameService.init(); - List gameHistories = gameService.startGame(answer); + Words words = gameService.init(); + List gameHistories = gameService.startGame(words); gameService.endGame(gameHistories); } } diff --git a/src/main/java/domain/Words.java b/src/main/java/domain/Words.java index c92d8745..612c3a5d 100644 --- a/src/main/java/domain/Words.java +++ b/src/main/java/domain/Words.java @@ -28,6 +28,18 @@ public Answer getAnswer(LocalDate now) { return new Answer(answer); } + public Word getWord(String word) { + Word inputWord = new Word(word); + validateExist(inputWord); + return inputWord; + } + + private void validateExist(Word word) { + if (!words.contains(word)) { + throw new IllegalArgumentException("존재하지 않는 단어입니다."); + } + } + public List getWords() { return words; } diff --git a/src/main/java/service/GameService.java b/src/main/java/service/GameService.java index 16c199ef..b7e60027 100644 --- a/src/main/java/service/GameService.java +++ b/src/main/java/service/GameService.java @@ -16,18 +16,18 @@ public class GameService { - public Answer init() { + public Words init() { InputView.inputStartGame(); - Words words = new Words(WordsGenerator.read(FileConfig.FILE_PATH)); - return words.getAnswer(LocalDate.now()); + return new Words(WordsGenerator.read(FileConfig.FILE_PATH)); } - public List startGame(Answer answer) { + public List startGame(Words words) { List gameHistories = new ArrayList<>(); + Answer answer = words.getAnswer(LocalDate.now()); int count = 0; while (isRound(answer, count)) { - Word inputWord = new Word(InputView.inputWord()); + Word inputWord = words.getWord(InputView.inputWord()); List tiles = answer.compare(inputWord); gameHistories.add(new GameHistory(tiles)); print(answer, gameHistories); diff --git a/src/test/java/domain/WordsTest.java b/src/test/java/domain/WordsTest.java index ed49ad49..ee08eef3 100644 --- a/src/test/java/domain/WordsTest.java +++ b/src/test/java/domain/WordsTest.java @@ -55,6 +55,25 @@ void test04(LocalDate now, String result) { assertThat(answer).isEqualTo(getAnswer(result)); } + @DisplayName("Word 를 가져온다.") + @Test + void test05() { + Words words = new Words(List.of("MySQL", "SLiPP", "Words")); + + Word word = words.getWord("MySQL"); + + assertThat(word).isEqualTo(new Word("MySQL")); + } + + @DisplayName("Word 가 존재하지 않는다면 에러가 발생한다.") + @Test + void test06() { + Words words = new Words(List.of("MySQL", "SLiPP", "Words")); + + assertThatThrownBy(() -> words.getWord("build")) + .isInstanceOf(IllegalArgumentException.class); + } + static Stream generateAnswerData() { return Stream.of( Arguments.of(Words.DEFAULT_DATE.plusDays(0), "MySQL"), From 5087c8579e3a8c623b30e2b6dcf55331df0ebe47 Mon Sep 17 00:00:00 2001 From: anwjrrp33 Date: Sat, 15 Apr 2023 17:11:12 +0900 Subject: [PATCH 30/30] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 49d9f313..e38df1bb 100644 --- a/README.md +++ b/README.md @@ -20,16 +20,16 @@ * 정답 * [x] 입력된 답안을 존재하는 Word 인지 비교한다. * 답안 - * [ ] 사용자가 워드를 입력한다. - * [ ] 글자는 5글자까지 입력 가능하다. - * [ ] 사용자가 정답을 6번까지 입력할 수 있다. - * [ ] 입력된 답안은 `words.txt`에 존재하는 단어여야 한다. + * [x] 사용자가 워드를 입력한다. + * [x] 글자는 5글자까지 입력 가능하다. + * [x] 사용자가 정답을 6번까지 입력할 수 있다. + * [x] 입력된 답안은 `words.txt`에 존재하는 단어여야 한다. * 출력 - * [ ] 타일로 결과를 표시한다. - * [ ] 위치와 글자가 맞으면 초록색 - * [ ] 위치가 틀리고, 글자가 맞으면 노란색 - * [ ] 위치와 글자가 틀리면 회색 - * [ ] 두 개의 동일한 문자를 입력하고 그중 하나가 회색으로 표시되면 해당 문자 중 하나만 최종 단어에 나타난다. + * [x] 타일로 결과를 표시한다. + * [x] 위치와 글자가 맞으면 초록색 + * [x] 위치가 틀리고, 글자가 맞으면 노란색 + * [x] 위치와 글자가 틀리면 회색 + * [x] 두 개의 동일한 문자를 입력하고 그중 하나가 회색으로 표시되면 해당 문자 중 하나만 최종 단어에 나타난다. ## 유비쿼터스 언어 * Word