From f9b0d0be655e7b0a10f274434cc8b91eb1619433 Mon Sep 17 00:00:00 2001 From: "winnie.ka" Date: Fri, 16 Dec 2022 16:26:12 +0900 Subject: [PATCH 01/10] =?UTF-8?q?docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=AA=85=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숫자 야구 게임 기능 명세 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index fcf3f057..2cf18885 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,9 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 기능 요구사항 +- [ ] 3자리 수를 0~9 숫자 3개로 변환 +- [ ] 1~9의 서로 다른 임의의 숫자 3개 생성 +- [ ] 스트라이크 / 볼 / 낫싱 판별 +- [ ] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file From b2c82db96a11f759816c7729f6ad4f3ef541716c Mon Sep 17 00:00:00 2001 From: "winnie.ka" Date: Fri, 16 Dec 2022 19:14:19 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat:=203=EC=9E=90=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EB=A5=BC=200~9=20=EC=88=AB=EC=9E=90=203=EA=B0=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit int -> int[] --- README.md | 2 +- src/main/java/NumSet.java | 9 +++++++++ src/test/java/NumSetTest.java | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/NumSet.java create mode 100644 src/test/java/NumSetTest.java diff --git a/README.md b/README.md index 2cf18885..72df03d9 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 기능 요구사항 -- [ ] 3자리 수를 0~9 숫자 3개로 변환 +- [x] 3자리 수를 0~9 숫자 3개로 변환 - [ ] 1~9의 서로 다른 임의의 숫자 3개 생성 - [ ] 스트라이크 / 볼 / 낫싱 판별 - [ ] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file diff --git a/src/main/java/NumSet.java b/src/main/java/NumSet.java new file mode 100644 index 00000000..bdbfa56c --- /dev/null +++ b/src/main/java/NumSet.java @@ -0,0 +1,9 @@ +public class NumSet { + public static int[] convertToList(int num) { + return new int[]{ + num / 100, + num / 10 % 10, + num % 10 + }; + } +} diff --git a/src/test/java/NumSetTest.java b/src/test/java/NumSetTest.java new file mode 100644 index 00000000..82ecf3fe --- /dev/null +++ b/src/test/java/NumSetTest.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class NumSetTest { + @Test + void convertToList() { + assertThat(NumSet.convertToList(123)).isEqualTo(new int[]{1, 2, 3}); + assertThat(NumSet.convertToList(719)).isEqualTo(new int[]{7, 1, 9}); + } +} \ No newline at end of file From e8fc9f065f683510ec74f71912d4049635d8619e Mon Sep 17 00:00:00 2001 From: "winnie.ka" Date: Sun, 18 Dec 2022 17:15:35 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=201~9=EC=9D=98=20=EC=84=9C=EB=A1=9C?= =?UTF-8?q?=20=EB=8B=A4=EB=A5=B8=20=EC=9E=84=EC=9D=98=EC=9D=98=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=203=EA=B0=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NumSet이 1~9 숫자 3개를 저장하는 int[]를 가짐 NumSet의 생성자에서 int[]에 랜덤 숫자 생성하여 저장 --- README.md | 2 +- src/main/java/NumSet.java | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72df03d9..4de50960 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,6 @@ ## 기능 요구사항 - [x] 3자리 수를 0~9 숫자 3개로 변환 -- [ ] 1~9의 서로 다른 임의의 숫자 3개 생성 +- [x] 1~9의 서로 다른 임의의 숫자 3개 생성 - [ ] 스트라이크 / 볼 / 낫싱 판별 - [ ] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file diff --git a/src/main/java/NumSet.java b/src/main/java/NumSet.java index bdbfa56c..0472afe3 100644 --- a/src/main/java/NumSet.java +++ b/src/main/java/NumSet.java @@ -1,4 +1,27 @@ +import java.util.Random; + public class NumSet { + private int[] numArr = new int[3]; + + public NumSet() { + Random random = new Random(); + for (int i = 0; i < 3; i++) { + while (true) { + numArr[i] = random.nextInt(1, 10); + if (isDiffFromForward(i)) + break; + } + } + } + + private boolean isDiffFromForward(int idx) { + for (int i = 0; i < idx; i++) { + if (numArr[idx] == numArr[i]) + return false; + } + return true; + } + public static int[] convertToList(int num) { return new int[]{ num / 100, From 8dcf229354a89729a191e3986b42f93d21d420ba Mon Sep 17 00:00:00 2001 From: "winnie.ka" Date: Sun, 18 Dec 2022 20:49:52 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC=20/=20=EB=B3=BC=20/=20=EB=82=AB=EC=8B=B1=20?= =?UTF-8?q?=ED=8C=90=EB=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MatchResult에 스트라이크/볼 개수 카운트해서 저장 스크라이크와 볼이 없으면 낫싱 --- README.md | 2 +- src/main/java/MatchResult.java | 8 ++++++++ src/main/java/NumSet.java | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/MatchResult.java diff --git a/README.md b/README.md index 4de50960..f130372b 100644 --- a/README.md +++ b/README.md @@ -9,5 +9,5 @@ ## 기능 요구사항 - [x] 3자리 수를 0~9 숫자 3개로 변환 - [x] 1~9의 서로 다른 임의의 숫자 3개 생성 -- [ ] 스트라이크 / 볼 / 낫싱 판별 +- [x] 스트라이크 / 볼 / 낫싱 판별 - [ ] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file diff --git a/src/main/java/MatchResult.java b/src/main/java/MatchResult.java new file mode 100644 index 00000000..06c739d4 --- /dev/null +++ b/src/main/java/MatchResult.java @@ -0,0 +1,8 @@ +public class MatchResult { + private int strike, ball; + + public MatchResult(int strike, int ball) { + this.strike = strike; + this.ball = ball; + } +} diff --git a/src/main/java/NumSet.java b/src/main/java/NumSet.java index 0472afe3..339c0900 100644 --- a/src/main/java/NumSet.java +++ b/src/main/java/NumSet.java @@ -22,6 +22,37 @@ private boolean isDiffFromForward(int idx) { return true; } + // 사용자가 '112'처럼 중복 숫자를 입력할 때 + // 스트라이크와 볼이 중복 카운트되지 않도록 + // 포함하는 수 카운트에서 스트라이크를 빼서 볼을 계산 + public MatchResult match(int[] userArr) { + int strike = countStrike(userArr); + int ball = countContains(userArr) - strike; + return new MatchResult(strike, ball); + } + + private int countStrike(int[] userArr) { + int strike = 0; + for (int i = 0; i < 3; i++) { + if (numArr[i] == userArr[i]) + strike++; + } + return strike; + } + + private int countContains(int[] userArr) { + int contains = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (numArr[i] == userArr[j]) { + contains++; + break; + } + } + } + return contains; + } + public static int[] convertToList(int num) { return new int[]{ num / 100, From b6593b7eebcabce8b111db9098a7b13dbcb16d2c Mon Sep 17 00:00:00 2001 From: "winnie.ka" Date: Sun, 18 Dec 2022 21:48:19 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20-=20=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EB=A7=8C=EC=A1=B1=ED=95=A0=20=EB=95=8C?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EA=B2=8C=EC=9E=84=20=EB=B0=98=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 정답 생성 2. 사용자 입력 받으며 스트라이크/볼/낫싱 체크 3. 정답이면 게임 종료 4. 게임 지속할지 입력 받고 그렇다면 새 게임 --- README.md | 2 +- src/main/java/Game.java | 36 ++++++++++++++++++++++++++++++++++ src/main/java/Main.java | 11 +++++++++++ src/main/java/MatchResult.java | 14 +++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Game.java create mode 100644 src/main/java/Main.java diff --git a/README.md b/README.md index f130372b..fa3fc46b 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,4 @@ - [x] 3자리 수를 0~9 숫자 3개로 변환 - [x] 1~9의 서로 다른 임의의 숫자 3개 생성 - [x] 스트라이크 / 볼 / 낫싱 판별 -- [ ] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file +- [x] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file diff --git a/src/main/java/Game.java b/src/main/java/Game.java new file mode 100644 index 00000000..c9ac6936 --- /dev/null +++ b/src/main/java/Game.java @@ -0,0 +1,36 @@ +import java.util.Scanner; + +public class Game { + private NumSet answer; + + public void reset() { + answer = new NumSet(); + } + + public void start() { + Scanner sc = new Scanner(System.in); + while (true) { + System.out.print("숫자를 입력해주세요 : "); + int[] submitted = NumSet.convertToList(sc.nextInt()); + + MatchResult matchResult = answer.match(submitted); + matchResult.printResult(); + + if (matchResult.isCorrect()) + break; + } + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + + public boolean willContinue() { + Scanner sc = new Scanner(System.in); + while (true) { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + int next = sc.nextInt(); + if (next == 1) + return true; + if (next == 2) + return false; + } + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..b61c4f43 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,11 @@ +public class Main { + public static void main(String[] args) { + Game game = new Game(); + while (true) { + game.reset(); + game.start(); + if (!game.willContinue()) + break; + } + } +} diff --git a/src/main/java/MatchResult.java b/src/main/java/MatchResult.java index 06c739d4..5d0a9b92 100644 --- a/src/main/java/MatchResult.java +++ b/src/main/java/MatchResult.java @@ -5,4 +5,18 @@ public MatchResult(int strike, int ball) { this.strike = strike; this.ball = ball; } + + public boolean isCorrect() { + return strike == 3; + } + + public void printResult() { + if (strike != 0) + System.out.print(strike + " 스트라이크 "); + if (ball != 0) + System.out.print(ball + "볼"); + if (strike == 0 && ball == 0) + System.out.print("낫싱"); + System.out.println(); + } } From 855da40825c5068779599edd1535fb1b0277ddae Mon Sep 17 00:00:00 2001 From: gh1224 Date: Sun, 18 Dec 2022 22:44:54 +0900 Subject: [PATCH 06/10] =?UTF-8?q?docs(README.md):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20TODO=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NumSet의 private 멤버 변수에 접근하지 못해 작성 못한 테스트 코드 작성하기 --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa3fc46b..99477ab3 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,9 @@ - [x] 3자리 수를 0~9 숫자 3개로 변환 - [x] 1~9의 서로 다른 임의의 숫자 3개 생성 - [x] 스트라이크 / 볼 / 낫싱 판별 -- [x] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 \ No newline at end of file +- [x] 메인 로직 - 게임 종료 조건 만족할 때까지 게임 반복 + +## 테스트 코드 작성 +해결할 점: private 변수에 접근할 수 없어 테스트 불가 +- [ ] 랜덤 숫자 3개 생성 +- [ ] 스트라이크 / 볼 / 낫싱 판별 \ No newline at end of file From 63dfdea3d6a3521a3ac41b9772d4941bacf32a54 Mon Sep 17 00:00:00 2001 From: gh1224 Date: Wed, 21 Dec 2022 22:55:03 +0900 Subject: [PATCH 07/10] =?UTF-8?q?refactor:=20indent=20depth=EA=B0=80=201?= =?UTF-8?q?=EC=9D=84=20=EB=84=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로그래밍 요구사항 준수 메소드 분리 / 변수 사용 / 삼항 연산자 사용 등의 방법을 사용하여 리팩토링 --- src/main/java/Game.java | 18 +++++++------- src/main/java/Main.java | 6 ++--- src/main/java/NumSet.java | 51 ++++++++++++++++++++------------------- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/main/java/Game.java b/src/main/java/Game.java index c9ac6936..616fc09f 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -9,28 +9,28 @@ public void reset() { public void start() { Scanner sc = new Scanner(System.in); - while (true) { + boolean isCorrect = false; + while (!isCorrect) { System.out.print("숫자를 입력해주세요 : "); int[] submitted = NumSet.convertToList(sc.nextInt()); MatchResult matchResult = answer.match(submitted); matchResult.printResult(); - if (matchResult.isCorrect()) - break; + isCorrect = matchResult.isCorrect(); } System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } public boolean willContinue() { Scanner sc = new Scanner(System.in); - while (true) { + + int next = 0; + while (next != 1 && next != 2) { System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - int next = sc.nextInt(); - if (next == 1) - return true; - if (next == 2) - return false; + next = sc.nextInt(); } + + return next == 1; } } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index b61c4f43..01c3d2d9 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,11 +1,11 @@ public class Main { public static void main(String[] args) { Game game = new Game(); - while (true) { + boolean willContinue = true; + while (willContinue) { game.reset(); game.start(); - if (!game.willContinue()) - break; + willContinue = game.willContinue(); } } } diff --git a/src/main/java/NumSet.java b/src/main/java/NumSet.java index 339c0900..fcc731b9 100644 --- a/src/main/java/NumSet.java +++ b/src/main/java/NumSet.java @@ -4,22 +4,24 @@ public class NumSet { private int[] numArr = new int[3]; public NumSet() { + for (int i = 0; i < 3; i++) + setRandomNum(i); + } + + private void setRandomNum(int idx) { Random random = new Random(); - for (int i = 0; i < 3; i++) { - while (true) { - numArr[i] = random.nextInt(1, 10); - if (isDiffFromForward(i)) - break; - } + boolean isDiff = false; + while (!isDiff) { + numArr[idx] = random.nextInt(1, 10); + isDiff = isDiffFromForward(idx); } } private boolean isDiffFromForward(int idx) { - for (int i = 0; i < idx; i++) { - if (numArr[idx] == numArr[i]) - return false; - } - return true; + boolean isPrevDiff = true; + for (int i = 0; i < idx; i++) + isPrevDiff = isPrevDiff && (numArr[idx] != numArr[i]); + return isPrevDiff; } // 사용자가 '112'처럼 중복 숫자를 입력할 때 @@ -33,24 +35,23 @@ public MatchResult match(int[] userArr) { private int countStrike(int[] userArr) { int strike = 0; - for (int i = 0; i < 3; i++) { - if (numArr[i] == userArr[i]) - strike++; - } + for (int i = 0; i < 3; i++) + strike += (numArr[i] == userArr[i]) ? 1 : 0; // depth 1로 만들기 위해... return strike; } private int countContains(int[] userArr) { - int contains = 0; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (numArr[i] == userArr[j]) { - contains++; - break; - } - } - } - return contains; + int cnt = 0; + for (int i = 0; i < 3; i++) + cnt += contains(i, userArr) ? 1 : 0; + return cnt; + } + + private boolean contains(int idx, int[] userArr) { + boolean hasNum = false; + for (int i = 0; i < 3; i++) + hasNum = hasNum || (numArr[idx] == userArr[i]); + return false; } public static int[] convertToList(int num) { From 26960e60365faf481cb870cc5037e350a70e951a Mon Sep 17 00:00:00 2001 From: gh1224 Date: Wed, 21 Dec 2022 22:58:00 +0900 Subject: [PATCH 08/10] =?UTF-8?q?docs(README.md):=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 99477ab3..25799124 100644 --- a/README.md +++ b/README.md @@ -14,5 +14,6 @@ ## 테스트 코드 작성 해결할 점: private 변수에 접근할 수 없어 테스트 불가 +- [x] 3자리 수를 자릿수로 split - [ ] 랜덤 숫자 3개 생성 - [ ] 스트라이크 / 볼 / 낫싱 판별 \ No newline at end of file From 150ba7a03ae57df9b9e3942553122beeaa3dc5ff Mon Sep 17 00:00:00 2001 From: gh1224 Date: Thu, 22 Dec 2022 00:01:31 +0900 Subject: [PATCH 09/10] =?UTF-8?q?test:=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=203=EA=B0=9C=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 1~9의 숫자 2. 서로 다른 숫자 private 멤버 변수값을 reflection으로 가져와 테스트 --- README.md | 2 +- src/test/java/NumSetTest.java | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 25799124..273a01a7 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,5 @@ ## 테스트 코드 작성 해결할 점: private 변수에 접근할 수 없어 테스트 불가 - [x] 3자리 수를 자릿수로 split -- [ ] 랜덤 숫자 3개 생성 +- [x] 랜덤 숫자 3개 생성 - [ ] 스트라이크 / 볼 / 낫싱 판별 \ No newline at end of file diff --git a/src/test/java/NumSetTest.java b/src/test/java/NumSetTest.java index 82ecf3fe..7f2edc53 100644 --- a/src/test/java/NumSetTest.java +++ b/src/test/java/NumSetTest.java @@ -1,5 +1,7 @@ import org.junit.jupiter.api.Test; +import java.lang.reflect.Field; + import static org.assertj.core.api.Assertions.*; class NumSetTest { @@ -8,4 +10,23 @@ void convertToList() { assertThat(NumSet.convertToList(123)).isEqualTo(new int[]{1, 2, 3}); assertThat(NumSet.convertToList(719)).isEqualTo(new int[]{7, 1, 9}); } + + @Test + void generateRandom3Number() throws NoSuchFieldException, IllegalAccessException { + Field numArrField = NumSet.class.getDeclaredField("numArr"); + numArrField.setAccessible(true); + + for (int i = 0; i < 200; i++) { + NumSet numSet = new NumSet(); + int[] numArr = (int[]) numArrField.get(numSet); + + assertThat(numArr[0]).isBetween(1, 9); + assertThat(numArr[1]).isBetween(1, 9); + assertThat(numArr[2]).isBetween(1, 9); + + assertThat(numArr[0]).isNotEqualTo(numArr[1]); + assertThat(numArr[1]).isNotEqualTo(numArr[2]); + assertThat(numArr[2]).isNotEqualTo(numArr[0]); + } + } } \ No newline at end of file From b34ccefef396fa2ef553528c0ca59b09808052c7 Mon Sep 17 00:00:00 2001 From: gh1224 Date: Thu, 22 Dec 2022 00:28:35 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=EB=B3=BC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EC=88=98=EC=A0=95=20+=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC/=EB=B3=BC/=EB=82=AB?= =?UTF-8?q?=EC=8B=B1=20=ED=8C=90=EB=B3=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 볼 개수 계산에서 버그 수정 ㄴ 리팩토링하면서 생긴 버그 스트라이크/볼/낫싱 판별하는 모듈 테스트 작성 볼 개수 계산 버그 발견 --- README.md | 2 +- src/main/java/NumSet.java | 2 +- src/test/java/NumSetTest.java | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 273a01a7..72fa4561 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ 해결할 점: private 변수에 접근할 수 없어 테스트 불가 - [x] 3자리 수를 자릿수로 split - [x] 랜덤 숫자 3개 생성 -- [ ] 스트라이크 / 볼 / 낫싱 판별 \ No newline at end of file +- [x] 스트라이크 / 볼 / 낫싱 판별 \ No newline at end of file diff --git a/src/main/java/NumSet.java b/src/main/java/NumSet.java index fcc731b9..15b44e90 100644 --- a/src/main/java/NumSet.java +++ b/src/main/java/NumSet.java @@ -51,7 +51,7 @@ private boolean contains(int idx, int[] userArr) { boolean hasNum = false; for (int i = 0; i < 3; i++) hasNum = hasNum || (numArr[idx] == userArr[i]); - return false; + return hasNum; } public static int[] convertToList(int num) { diff --git a/src/test/java/NumSetTest.java b/src/test/java/NumSetTest.java index 7f2edc53..2f7407f5 100644 --- a/src/test/java/NumSetTest.java +++ b/src/test/java/NumSetTest.java @@ -1,4 +1,6 @@ import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.lang.reflect.Field; @@ -29,4 +31,28 @@ void generateRandom3Number() throws NoSuchFieldException, IllegalAccessException assertThat(numArr[2]).isNotEqualTo(numArr[0]); } } + + + @ParameterizedTest + @CsvSource({"1,2,3,3,0", "1,3,2,1,2", "1,2,4,2,0", "4,5,1,0,1", "4,5,6,0,0"}) + void match(int userNum1, int userNum2, int userNum3, int strikeExpected, int ballExpected) throws NoSuchFieldException, IllegalAccessException { + Field numArrField = NumSet.class.getDeclaredField("numArr"); + numArrField.setAccessible(true); + + NumSet numSet = new NumSet(); + numArrField.set(numSet, new int[]{1, 2, 3}); + + Field strikeField = MatchResult.class.getDeclaredField("strike"); + strikeField.setAccessible(true); + + Field ballField = MatchResult.class.getDeclaredField("ball"); + ballField.setAccessible(true); + + MatchResult matchResult = numSet.match(new int[]{userNum1, userNum2, userNum3}); + int strike = strikeField.getInt(matchResult); + int ball = ballField.getInt(matchResult); + + assertThat(strike).isEqualTo(strikeExpected); + assertThat(ball).isEqualTo(ballExpected); + } } \ No newline at end of file