From 82486fdbd61f4f6231df494a7b0468c46b72c007 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 15:48:13 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat=20:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/study/StringCalculator.java | 55 +++++++++++++++++++ src/test/java/study/StringCalculatorTest.java | 47 ++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/main/java/study/StringCalculator.java create mode 100644 src/test/java/study/StringCalculatorTest.java diff --git a/src/main/java/study/StringCalculator.java b/src/main/java/study/StringCalculator.java new file mode 100644 index 000000000..6307044ff --- /dev/null +++ b/src/main/java/study/StringCalculator.java @@ -0,0 +1,55 @@ +package study; + +import java.util.Scanner; + +public class StringCalculator { + // 사칙연산 + public int add(int a, int b){ return a + b;} + public int subtract(int a, int b){ return a - b;} + public int multiply(int a, int b){ return a * b;} + public int divide(int a, int b){ + try { + return a / b; + } catch (Exception e) { + System.out.println("0으로 나눌 수 없습니다."); + }return 0; + } + // 분할 메소드 + public String[] split(String str) { + return str.split(" "); + } + public int toInt(String input) { + return Integer.parseInt(input); + } + public int transform(String[] values) { + int result = toInt(values[0]); + for (int i = 1; i < values.length; i += 2) { + result = operator(result, values[i],toInt(values[i+1])); + } + return result; + } + // 더하기, 곱하기, 나누기, 빼기 함수 + public int operator(int firstValue, String operator, int secondValue) { + switch (operator) { + case "+": + return add(firstValue, secondValue); + case "-": + return subtract(firstValue, secondValue); + case "*": + return multiply(firstValue, secondValue); + case "/": + return divide(firstValue, secondValue); + default: + System.out.println("사칙 연산자가 아닙니다."); + + } + return 0; + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + String value = sc.nextLine(); + StringCalculator T = new StringCalculator(); + T.transform(T.split(value)); + } +} diff --git a/src/test/java/study/StringCalculatorTest.java b/src/test/java/study/StringCalculatorTest.java new file mode 100644 index 000000000..f97a5c785 --- /dev/null +++ b/src/test/java/study/StringCalculatorTest.java @@ -0,0 +1,47 @@ +package study; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StringCalculatorTest { + StringCalculator cal; + + @BeforeEach + public void setUp() { + cal = new StringCalculator(); + } + + @Test + public void add() { + assertEquals(7, cal.add(3, 4)); + } + + @Test + public void subtract() { + assertEquals(1, cal.subtract(5, 4)); + } + + @Test + public void multiply() { + assertEquals(6, cal.multiply(2, 3)); + } + + @Test + public void divide() { + assertEquals(2, cal.divide(8, 4)); + } + + @Test void calc() { + int result = cal.transform(cal.split("2 + 3 * 4 / 2")); + assertEquals(10, result); + } + + @AfterEach + public void tearDown() { + cal = null; + } +} \ No newline at end of file From 460dbcc211a68100644e78361d0bfd4ef149848a Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 15:56:25 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 8fe711203..2627cba8d 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,17 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` +4. 구현할 기능 목록 +```jsx +게임 시작 +- 3자리의 난수 생성 (조건 : 각 숫자가 겹치지 않는다) +- 사용자의 입력값 받고 저장 +- 난수와 입력값 비교 + - 같은 위치에 같은 숫자라면 strike + - 다른 위치에 같은 숫자가 있으면 ball + - 아무것도 겹치지 않으면 낫싱 +- 3 strike가 아니라면 다시 입력값 받기 +- 3 strike라면 게임이 끝 +- 게임을 다시 시작하거나 완전히 종료할 수 있다 +``` + From f790641c767359c5f73940c6b1a454014472eea6 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 16:30:24 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20-=201.=203=EC=9E=90=EB=A6=AC?= =?UTF-8?q?=EC=9D=98=20=EB=82=9C=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/numbersBaseball/NumbersBaseball.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/numbersBaseball/NumbersBaseball.java diff --git a/src/main/java/numbersBaseball/NumbersBaseball.java b/src/main/java/numbersBaseball/NumbersBaseball.java new file mode 100644 index 000000000..9d01806ff --- /dev/null +++ b/src/main/java/numbersBaseball/NumbersBaseball.java @@ -0,0 +1,31 @@ +package numbersBaseball; + +import java.util.Arrays; + +public class NumbersBaseball { + public static int[] number = new int[3]; + public static boolean[] check = new boolean[10]; + + public int duplicateCheck(int[] number, int idx, int num) { + if(!check[num]) { + number[idx] = num; + check[num] = true; + idx++; + } + return idx; //현재 idx 반환 + } + public void makeRandomNumber() { + int idx = 0; + while (idx != 3) { + int cur = ((int)(Math.random()*8)+1); // random number 생성 + idx = duplicateCheck(number, idx, cur); + } + } + + public static void main(String[] args) { + NumbersBaseball T = new NumbersBaseball(); + T.makeRandomNumber(); + System.out.println(Arrays.toString(number)); + } + +} From c995ff9d358460593ec3a7363ba1fc57e8a0bad4 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 18:22:31 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=A0=84=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=20-=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=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/test/java/study/SetTest.java | 46 +++++++++++++++++++++++++++++ src/test/java/study/StringTest.java | 38 ++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/test/java/study/SetTest.java diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 000000000..e4f3f15fd --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,46 @@ +package study; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SetTest { + private Set numbers; + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + // test case 구현 + @Test + @DisplayName("set 중복을 허용하지 않는 자료구조") + void size() { + assertThat(numbers.size()).isEqualTo(3); + } + + + @ParameterizedTest + @DisplayName("ParameterizedTest - 중복소거") + @ValueSource(ints = {1, 2, 3}) + void contains1(Integer integer) { + assertThat(numbers).contains(integer); //contains 메소드 결과 값이 true인 경우만 테스트 가능 + } + + @ParameterizedTest + @DisplayName("ParameterizedTest - 입력 값에 따라 결과 값이 다른 경우") + @CsvSource(value = {"1:true", "2:4", "3:5"}, delimiter = ':') + void contains2(String input, String output) { + assertEquals(input,output); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90b..e2e97abd1 100644 --- a/src/test/java/study/StringTest.java +++ b/src/test/java/study/StringTest.java @@ -1,8 +1,10 @@ package study; +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.assertThatExceptionOfType; public class StringTest { @Test @@ -10,4 +12,40 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + @Test + void split() { + String[] test1 = "1,2".split(","); + assertThat(test1).contains("1","2"); + + String[] test2 = "1".split(","); + assertThat(test2).containsExactly("1"); + } + + @Test + void substring() { + String test3 = "(1,2)".substring(1,4); + assertThat(test3).isEqualTo("1,2"); + } + + @Test + @DisplayName("charAt() - 특정 index의 문자 구하기 메소드") + void charAt() { + String test4 = "abc"; + char temp = test4.charAt(0); + assertThat(temp).isEqualTo('a'); + + } + @Test + @DisplayName("charAt() - 위치값을 벗어나 발생하는 예외") + void chatAtException() { + //when + String test4 = "abc"; + //then + assertThatExceptionOfType(IndexOutOfBoundsException.class) + .isThrownBy(()->{ + test4.charAt(4); + }).withMessageMatching("String index out of range: 4"); + } + } From f85515e9aaf45bb816585264c743c89fc2ae88fe Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 18:35:31 +0900 Subject: [PATCH 05/13] =?UTF-8?q?fix=20:=20setTest=20-=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=EA=B2=B0=EA=B3=BC=EA=B0=80=20=EB=8F=84=EC=B6=9C?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1,2,3 입력시 true 4,5 입력 시 false --- src/test/java/study/SetTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java index e4f3f15fd..8ffc28884 100644 --- a/src/test/java/study/SetTest.java +++ b/src/test/java/study/SetTest.java @@ -39,8 +39,9 @@ void contains1(Integer integer) { @ParameterizedTest @DisplayName("ParameterizedTest - 입력 값에 따라 결과 값이 다른 경우") - @CsvSource(value = {"1:true", "2:4", "3:5"}, delimiter = ':') + @CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':') void contains2(String input, String output) { - assertEquals(input,output); + boolean actualNum = numbers.contains(Integer.parseInt(input)); + assertEquals(Boolean.parseBoolean(output),actualNum); } } From 36f7630b4c3fd0b0dc8a30d5fa00d54d5da2232e Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 18:38:29 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat=20:=20=EB=82=9C=EC=88=98=EC=99=80=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=20=EB=B9=84=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/numbersBaseball/NumbersBaseball.java | 73 +++++++++++++++++-- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 8172fb73f..0606c3114 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ repositories { dependencies { testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" testImplementation "org.assertj:assertj-core:3.19.0" + testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' } test { diff --git a/src/main/java/numbersBaseball/NumbersBaseball.java b/src/main/java/numbersBaseball/NumbersBaseball.java index 9d01806ff..11768a807 100644 --- a/src/main/java/numbersBaseball/NumbersBaseball.java +++ b/src/main/java/numbersBaseball/NumbersBaseball.java @@ -1,31 +1,88 @@ package numbersBaseball; import java.util.Arrays; +import java.util.Scanner; public class NumbersBaseball { - public static int[] number = new int[3]; - public static boolean[] check = new boolean[10]; + public static int[] check = new int[10]; // 1 ~ 9 public int duplicateCheck(int[] number, int idx, int num) { - if(!check[num]) { + if(check[num] == 0) { number[idx] = num; - check[num] = true; + check[num] = idx + 1; // 인덱스값 저장 idx++; } return idx; //현재 idx 반환 } - public void makeRandomNumber() { + public void makeRandomNumber(int[] number) { int idx = 0; + while (idx != 3) { int cur = ((int)(Math.random()*8)+1); // random number 생성 idx = duplicateCheck(number, idx, cur); } + System.out.println(Arrays.toString(number)); + } + + public int compareTo(int[] compareNum){ + // 초기화 + int strike = 0, ball = 0; + boolean nothing=false; + + for (int i = 1; i <= 3; i++) { + int cur = compareNum[i]; + + if(check[cur] != 0 && check[cur] == i) { + strike++; + continue; + } + if(check[cur] != 0) { + ball++; + } + } + if(strike == 0 && ball == 0) nothing = true; + if(!nothing) { + System.out.println(strike + " 스트라이크"); + System.out.println(ball + " 볼"); + return strike; + } + System.out.println("낫싱"); + return 0; } + public void game(int[] number) { + Scanner sc = new Scanner(System.in); + int strike = 0; + makeRandomNumber(number); + + + while(strike != 3) { + System.out.print("숫자를 입력해 주세요 : "); + + int num = sc.nextInt(); + int[] compareNum = new int[4]; + compareNum[1] = num / 100; + compareNum[2] = (num % 100) / 10; + compareNum[3] = (num % 10); + + strike = compareTo(compareNum); + + } + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + } + public NumbersBaseball() { + int[] number = new int[3]; + while (true) { + game(number); + + Scanner sc = new Scanner(System.in); + int in = sc.nextInt(); + if(in == 2) return; + } + } public static void main(String[] args) { - NumbersBaseball T = new NumbersBaseball(); - T.makeRandomNumber(); - System.out.println(Arrays.toString(number)); + new NumbersBaseball(); } } From 8777b57d74a5c2d781216aec9b94f16f817e3a91 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 20:09:12 +0900 Subject: [PATCH 07/13] =?UTF-8?q?feat.=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=EC=9D=98=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ src/main/java/numbersBaseball/ValidationError.java | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 src/main/java/numbersBaseball/ValidationError.java diff --git a/README.md b/README.md index 2627cba8d..2c16716bf 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,9 @@ ex) git checkout -b apply-feedback 게임 시작 - 3자리의 난수 생성 (조건 : 각 숫자가 겹치지 않는다) - 사용자의 입력값 받고 저장 + - 입력값 검증 : + - 3자리의 각 자리가 중복이 안되는지, + - 1~9 사이의 수 인지 - 난수와 입력값 비교 - 같은 위치에 같은 숫자라면 strike - 다른 위치에 같은 숫자가 있으면 ball diff --git a/src/main/java/numbersBaseball/ValidationError.java b/src/main/java/numbersBaseball/ValidationError.java new file mode 100644 index 000000000..97916ed53 --- /dev/null +++ b/src/main/java/numbersBaseball/ValidationError.java @@ -0,0 +1,7 @@ +package numbersBaseball; + +public class ValidationError { + public static String intermediateValue = "1 ~ 9 사이의 숫자를 입력해주세요."; + public static String duplication = "중복된 값 없이 입력해주세요."; + +} From dca289c74701164d8ab0fe4a3c90979f0218cf0e Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 20:09:29 +0900 Subject: [PATCH 08/13] =?UTF-8?q?feat.=20InputView=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=20=20=20=20=20=20-=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=97=90?= =?UTF-8?q?=EA=B2=8C=203=EC=9E=90=EB=A6=AC=20=EC=88=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EA=B8=B0=20=20=20=20=20=20=20-=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EC=88=98=203=EC=9E=90=EB=A6=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EA=B8=B0=20=20=20=20=20=20=20+=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=EA=B0=92=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/numbersBaseball/InputView.java | 62 +++++++++++++++++++ .../java/numbersBaseball/NumbersBaseball.java | 50 ++++----------- 2 files changed, 73 insertions(+), 39 deletions(-) create mode 100644 src/main/java/numbersBaseball/InputView.java diff --git a/src/main/java/numbersBaseball/InputView.java b/src/main/java/numbersBaseball/InputView.java new file mode 100644 index 000000000..1cd250bc9 --- /dev/null +++ b/src/main/java/numbersBaseball/InputView.java @@ -0,0 +1,62 @@ +package numbersBaseball; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Scanner; + +public class InputView { + public static int[] check = new int[10]; // 1 ~ 9 + + // 3자리 수 입력 받기 + public static int inputNumber() { + Scanner sc = new Scanner(System.in); + return sc.nextInt(); + } + + // 랜덤 수 3자리 생성 + public static int duplicateCheck(int[] number, int idx, int num) { + if(check[num] == 0) { + number[idx] = num; + check[num] = idx + 1; // random number 각 인덱스값 저장 + idx++; + } + return idx; //현재 idx 반환 + } + public static void makeRandomNumber(int[] number) { + int idx = 0; + + while (idx != 3) { + int cur = ((int)(Math.random()*8)+1); // random number 생성 + idx = duplicateCheck(number, idx, cur); + } +// System.out.println(Arrays.toString(number)); + } + + + // validation + public static boolean validateNumber(int[] numList) { + boolean verification = false; + if(numList[1] == numList[2] || numList[2] == numList[3] + || numList[1] == numList[3]) { + System.out.println(ValidationError.duplication); + return verification; + } + for (int num : numList) { + if(!((0 < num) && (num < 10))) { + System.out.println(ValidationError.intermediateValue); + return verification; + } + } + + return true; + } + + // 정수 쪼개기 + public static int[] splitNumber(int inputNum) { + int[] numList = new int[4]; + numList[1] = inputNum / 100; + numList[2] = (inputNum % 100) / 10; + numList[3] = (inputNum % 10); + return numList; + } +} diff --git a/src/main/java/numbersBaseball/NumbersBaseball.java b/src/main/java/numbersBaseball/NumbersBaseball.java index 11768a807..563131743 100644 --- a/src/main/java/numbersBaseball/NumbersBaseball.java +++ b/src/main/java/numbersBaseball/NumbersBaseball.java @@ -1,28 +1,6 @@ package numbersBaseball; -import java.util.Arrays; -import java.util.Scanner; - public class NumbersBaseball { - public static int[] check = new int[10]; // 1 ~ 9 - - public int duplicateCheck(int[] number, int idx, int num) { - if(check[num] == 0) { - number[idx] = num; - check[num] = idx + 1; // 인덱스값 저장 - idx++; - } - return idx; //현재 idx 반환 - } - public void makeRandomNumber(int[] number) { - int idx = 0; - - while (idx != 3) { - int cur = ((int)(Math.random()*8)+1); // random number 생성 - idx = duplicateCheck(number, idx, cur); - } - System.out.println(Arrays.toString(number)); - } public int compareTo(int[] compareNum){ // 초기화 @@ -32,11 +10,11 @@ public int compareTo(int[] compareNum){ for (int i = 1; i <= 3; i++) { int cur = compareNum[i]; - if(check[cur] != 0 && check[cur] == i) { + if(InputView.check[cur] != 0 && InputView.check[cur] == i) { strike++; continue; } - if(check[cur] != 0) { + if(InputView.check[cur] != 0) { ball++; } } @@ -50,35 +28,29 @@ public int compareTo(int[] compareNum){ return 0; } - public void game(int[] number) { - Scanner sc = new Scanner(System.in); + public void game(int[] randomNum) { int strike = 0; - makeRandomNumber(number); - + InputView.makeRandomNumber(randomNum); while(strike != 3) { System.out.print("숫자를 입력해 주세요 : "); - int num = sc.nextInt(); - int[] compareNum = new int[4]; - compareNum[1] = num / 100; - compareNum[2] = (num % 100) / 10; - compareNum[3] = (num % 10); + int inputNum = InputView.inputNumber(); + int[] inputList = InputView.splitNumber(inputNum); + if(!InputView.validateNumber(inputList)) continue; + strike = compareTo(inputList); - strike = compareTo(compareNum); } System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); } public NumbersBaseball() { - int[] number = new int[3]; + int[] randomNum = new int[3]; while (true) { - game(number); + game(randomNum); - Scanner sc = new Scanner(System.in); - int in = sc.nextInt(); - if(in == 2) return; + if(InputView.inputNumber() == 2) return; } } public static void main(String[] args) { From 5ee8dff9b78011cb5fa741c29d03c85b275036ab Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 20:39:07 +0900 Subject: [PATCH 09/13] =?UTF-8?q?feat.=20ResultView=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=20-=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EB=8A=94=20=EA=B2=B0=EA=B3=BC=EC=B6=9C=EB=A0=A5=20(st?= =?UTF-8?q?rike,=20ball,=20=EB=82=AB=EC=8B=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/numbersBaseball/InputView.java | 4 ++-- .../java/numbersBaseball/NumbersBaseball.java | 15 ++++----------- src/main/java/numbersBaseball/ResultView.java | 12 ++++++++++++ 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 src/main/java/numbersBaseball/ResultView.java diff --git a/src/main/java/numbersBaseball/InputView.java b/src/main/java/numbersBaseball/InputView.java index 1cd250bc9..d7a2a6137 100644 --- a/src/main/java/numbersBaseball/InputView.java +++ b/src/main/java/numbersBaseball/InputView.java @@ -1,7 +1,6 @@ package numbersBaseball; import java.util.Arrays; -import java.util.Collections; import java.util.Scanner; public class InputView { @@ -41,7 +40,8 @@ public static boolean validateNumber(int[] numList) { System.out.println(ValidationError.duplication); return verification; } - for (int num : numList) { + for (int i = 1; i Date: Mon, 5 Aug 2024 20:52:48 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor.=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20=ED=8E=B8=ED=95=98=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++++- src/main/java/numbersBaseball/InputView.java | 16 +++++++++------- .../java/numbersBaseball/NumbersBaseball.java | 11 +++++------ src/main/java/numbersBaseball/ResultView.java | 16 +++++++++++----- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 2c16716bf..0adb608f4 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,17 @@ git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` 4. 구현할 기능 목록 + +### InputView ```jsx -게임 시작 - 3자리의 난수 생성 (조건 : 각 숫자가 겹치지 않는다) - 사용자의 입력값 받고 저장 - 입력값 검증 : - 3자리의 각 자리가 중복이 안되는지, - 1~9 사이의 수 인지 +``` +### NumbersBaseball +```jsx - 난수와 입력값 비교 - 같은 위치에 같은 숫자라면 strike - 다른 위치에 같은 숫자가 있으면 ball @@ -40,4 +44,9 @@ ex) git checkout -b apply-feedback - 3 strike라면 게임이 끝 - 게임을 다시 시작하거나 완전히 종료할 수 있다 ``` +### ResultView +```jsx +- strike, ball, nothing 점수 혹은 결과 출력 +- 3 strike일 때 종료 메세지 출력 +``` diff --git a/src/main/java/numbersBaseball/InputView.java b/src/main/java/numbersBaseball/InputView.java index d7a2a6137..178ec4d24 100644 --- a/src/main/java/numbersBaseball/InputView.java +++ b/src/main/java/numbersBaseball/InputView.java @@ -1,6 +1,5 @@ package numbersBaseball; -import java.util.Arrays; import java.util.Scanner; public class InputView { @@ -13,34 +12,35 @@ public static int inputNumber() { } // 랜덤 수 3자리 생성 - public static int duplicateCheck(int[] number, int idx, int num) { + public static int duplicateCheck(int[] randomNum, int idx, int num) { if(check[num] == 0) { - number[idx] = num; + randomNum[idx] = num; check[num] = idx + 1; // random number 각 인덱스값 저장 idx++; } return idx; //현재 idx 반환 } - public static void makeRandomNumber(int[] number) { + public static void makeRandomNumber(int[] randomNum) { int idx = 0; while (idx != 3) { int cur = ((int)(Math.random()*8)+1); // random number 생성 - idx = duplicateCheck(number, idx, cur); + idx = duplicateCheck(randomNum, idx, cur); } -// System.out.println(Arrays.toString(number)); } // validation public static boolean validateNumber(int[] numList) { boolean verification = false; + if(numList[1] == numList[2] || numList[2] == numList[3] || numList[1] == numList[3]) { System.out.println(ValidationError.duplication); return verification; } - for (int i = 1; i Date: Mon, 5 Aug 2024 21:14:50 +0900 Subject: [PATCH 11/13] =?UTF-8?q?fix.=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/numbersBaseball/NumbersBaseball.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/numbersBaseball/NumbersBaseball.java b/src/main/java/numbersBaseball/NumbersBaseball.java index dc173428a..f33c00432 100644 --- a/src/main/java/numbersBaseball/NumbersBaseball.java +++ b/src/main/java/numbersBaseball/NumbersBaseball.java @@ -31,7 +31,7 @@ public void game(int[] randomNum) { int inputNum = InputView.inputNumber(); int[] inputList = InputView.splitNumber(inputNum); - if(InputView.validateNumber(inputList)) continue; + if(!InputView.validateNumber(inputList)) continue; strike = compareTo(inputList); } From 933896b4db800afce075c4a10098d00269eb0735 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Mon, 5 Aug 2024 22:13:38 +0900 Subject: [PATCH 12/13] =?UTF-8?q?feat.=20InputView=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/numbersBaseball/InputViewTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/test/java/numbersBaseball/InputViewTest.java diff --git a/src/test/java/numbersBaseball/InputViewTest.java b/src/test/java/numbersBaseball/InputViewTest.java new file mode 100644 index 000000000..85f032e53 --- /dev/null +++ b/src/test/java/numbersBaseball/InputViewTest.java @@ -0,0 +1,51 @@ +package numbersBaseball; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class InputViewTest { + // 난수 생성 테스트 + @Test + void makeRandomNumTest() { + int[] randomNum = new int[3]; + + InputView.makeRandomNumber(randomNum); + for (int i = 0; i < randomNum.length; i++) { + assertThat(0 < randomNum[i] && randomNum[i] <10).isEqualTo(true); + assertThat(InputView.check[randomNum[i]]).isNotZero(); + } + } + // 각 자리수를 정수 배열로 생성하는 테스트 + @Test + void splitNumTest() { + int num = 235; + int[] numList = InputView.splitNumber(num); + assertThat(Arrays.toString(numList)).isEqualTo("[0, 2, 3, 5]"); // idx 1~3 사용 + } + + /** + * 입력값 유효성 검증 테스트 + */ + @Test + void validateNumTest_success() { + int[] numList = InputView.splitNumber(146); + assertThat(InputView.validateNumber(numList)).isEqualTo(true); + } + + // 사용자가 중복값 입력 시 false + @Test + void validateNumTest_fail1() { + int[] numList = InputView.splitNumber(444); + assertThat(InputView.validateNumber(numList)).isEqualTo(false); + } + // 사용자가 1~9 이외의 값 입력 시 + @Test + void validateNumTest_fail2() { + int[] numList = InputView.splitNumber(405); + assertThat(InputView.validateNumber(numList)).isEqualTo(false); + } +} \ No newline at end of file From 5f10bf1c62e3a1dc612edd09f2156ecb7881583f Mon Sep 17 00:00:00 2001 From: wjdtk Date: Fri, 9 Aug 2024 17:35:33 +0900 Subject: [PATCH 13/13] =?UTF-8?q?feat.=20=EB=B9=84=EA=B5=90=ED=95=A0=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20ArrayList=EB=A1=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=ED=9B=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/numbersBaseball/InputView.java | 34 +++++++++--------- .../java/numbersBaseball/NumbersBaseball.java | 8 +++-- .../java/numbersBaseball/InputViewTest.java | 13 ++++--- .../numbersBaseball/NumbersBaseballTest.java | 35 +++++++++++++++++++ 4 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 src/test/java/numbersBaseball/NumbersBaseballTest.java diff --git a/src/main/java/numbersBaseball/InputView.java b/src/main/java/numbersBaseball/InputView.java index 178ec4d24..c89bee5c0 100644 --- a/src/main/java/numbersBaseball/InputView.java +++ b/src/main/java/numbersBaseball/InputView.java @@ -1,5 +1,7 @@ package numbersBaseball; +import java.util.ArrayList; +import java.util.Collections; import java.util.Scanner; public class InputView { @@ -31,18 +33,16 @@ public static void makeRandomNumber(int[] randomNum) { // validation - public static boolean validateNumber(int[] numList) { + public static boolean validateNumber(ArrayList numList) { boolean verification = false; - if(numList[1] == numList[2] || numList[2] == numList[3] - || numList[1] == numList[3]) { - System.out.println(ValidationError.duplication); - return verification; - } - - for (int i = 1; i < numList.length; i++) { - int num = numList[i]; - if(!((0 < num) && (num < 10))) { + if(!(numList.size()==3)) return verification; + for (Integer number: numList) { + if(!(Collections.frequency(numList, number) == 1)) { + System.out.println(ValidationError.duplication); + return verification; + } + if(!((0 < number) && (number < 10))) { System.out.println(ValidationError.intermediateValue); return verification; } @@ -52,13 +52,13 @@ public static boolean validateNumber(int[] numList) { } // 정수 쪼개기 - public static int[] splitNumber(int inputNum) { - int[] numList = new int[4]; - - numList[1] = inputNum / 100; - numList[2] = (inputNum % 100) / 10; - numList[3] = (inputNum % 10); + public static ArrayList splitNumber(int inputNum) { +// int[] numList = new int[4]; + ArrayList arr = new ArrayList<>(); + arr.add(inputNum / 100); + arr.add((inputNum % 100) / 10); + arr.add((inputNum % 10)); - return numList; + return arr; } } diff --git a/src/main/java/numbersBaseball/NumbersBaseball.java b/src/main/java/numbersBaseball/NumbersBaseball.java index f33c00432..080f27314 100644 --- a/src/main/java/numbersBaseball/NumbersBaseball.java +++ b/src/main/java/numbersBaseball/NumbersBaseball.java @@ -1,13 +1,15 @@ package numbersBaseball; +import java.util.ArrayList; + public class NumbersBaseball { - public int compareTo(int[] compareNum){ + public static int compareTo(ArrayList compareNum){ // 초기화 int strike = 0, ball = 0; for (int i = 1; i <= 3; i++) { - int cur = compareNum[i]; + int cur = compareNum.get(i-1); if(InputView.check[cur] != 0 && InputView.check[cur] == i) { strike++; @@ -29,7 +31,7 @@ public void game(int[] randomNum) { System.out.print("숫자를 입력해 주세요 : "); int inputNum = InputView.inputNumber(); - int[] inputList = InputView.splitNumber(inputNum); + ArrayList inputList = InputView.splitNumber(inputNum); if(!InputView.validateNumber(inputList)) continue; diff --git a/src/test/java/numbersBaseball/InputViewTest.java b/src/test/java/numbersBaseball/InputViewTest.java index 85f032e53..e2635c7c9 100644 --- a/src/test/java/numbersBaseball/InputViewTest.java +++ b/src/test/java/numbersBaseball/InputViewTest.java @@ -2,10 +2,9 @@ import org.junit.jupiter.api.Test; -import java.util.Arrays; +import java.util.ArrayList; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class InputViewTest { // 난수 생성 테스트 @@ -23,8 +22,8 @@ void makeRandomNumTest() { @Test void splitNumTest() { int num = 235; - int[] numList = InputView.splitNumber(num); - assertThat(Arrays.toString(numList)).isEqualTo("[0, 2, 3, 5]"); // idx 1~3 사용 + ArrayList numList = InputView.splitNumber(num); + assertThat(numList.toString()).isEqualTo("[0, 2, 3, 5]"); // idx 1~3 사용 } /** @@ -32,20 +31,20 @@ void splitNumTest() { */ @Test void validateNumTest_success() { - int[] numList = InputView.splitNumber(146); + ArrayList numList = InputView.splitNumber(146); assertThat(InputView.validateNumber(numList)).isEqualTo(true); } // 사용자가 중복값 입력 시 false @Test void validateNumTest_fail1() { - int[] numList = InputView.splitNumber(444); + ArrayList numList = InputView.splitNumber(444); assertThat(InputView.validateNumber(numList)).isEqualTo(false); } // 사용자가 1~9 이외의 값 입력 시 @Test void validateNumTest_fail2() { - int[] numList = InputView.splitNumber(405); + ArrayList numList = InputView.splitNumber(405); assertThat(InputView.validateNumber(numList)).isEqualTo(false); } } \ No newline at end of file diff --git a/src/test/java/numbersBaseball/NumbersBaseballTest.java b/src/test/java/numbersBaseball/NumbersBaseballTest.java new file mode 100644 index 000000000..fff2c3a42 --- /dev/null +++ b/src/test/java/numbersBaseball/NumbersBaseballTest.java @@ -0,0 +1,35 @@ +package numbersBaseball; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static numbersBaseball.NumbersBaseball.compareTo; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + + +class NumbersBaseballTest { + // 각 자리수 비교 테스트 + @Test + void compareToTest() { + // given + int[] randomNum = new int[3]; + InputView.makeRandomNumber(randomNum); + + + ArrayList sameList = new ArrayList<>(); + for (int x: + randomNum) { + sameList.add(x); + } + + // expected + // strike의 개수가 0 이상? + assertEquals(compareTo(sameList), 3); + + } + +} \ No newline at end of file