From b3cd7fc413dc0e2ff608fc09ee41130a21cda758 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:39:30 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=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/Input.java | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/main/java/Input.java diff --git a/src/main/java/Input.java b/src/main/java/Input.java new file mode 100644 index 00000000..a38173e9 --- /dev/null +++ b/src/main/java/Input.java @@ -0,0 +1,87 @@ +import java.util.ArrayList; +import java.util.Scanner; + +public class Input { + private static final Scanner scanner = new Scanner(System.in); + + public static ArrayList inputNumbers(){ + while (true){ + try { + System.out.print("숫자를 입력해주세요 : "); + String input = scanner.next(); + return validateInputNumber(input); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + } + + public static Boolean inputContinue(){ + while (true){ + try { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String input = scanner.next(); + return validateContinue(input); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + } + + private static ArrayList validateInputNumber(String input){ + if (input == null || input.length() != 3){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + if (!isAllNumbers(input)){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + if (hasDuplicateNumbers(input)){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + return convertStringToNumbers(input); + } + + private static Boolean isAllNumbers(String input){ + for (int i = 0; i< input.length(); i++){ + if (!Character.isDigit(input.charAt(i))){ + return false; + } + } + return true; + } + + private static boolean hasDuplicateNumbers(String input) { + boolean[] used = new boolean[10]; // 0~9 체크용 + + for (int i = 0; i < input.length(); i++) { + int num = Character.getNumericValue(input.charAt(i)); + if (used[num]) { + return true; // 이미 나온 숫자 + } + used[num] = true; + } + return false; + } + + private static ArrayList convertStringToNumbers(String input){ + ArrayList numbers = new ArrayList<>(); + for (int i = 0; i< input.length(); i++){ + numbers.add(Character.getNumericValue(input.charAt(i))); + } + return numbers; + } + + private static boolean validateContinue(String input){ + if (input == null || input.length() != 1){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + if (!Character.isDigit(input.charAt(0))){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + int inputNumber = Character.getNumericValue(input.charAt(0)); + if (inputNumber != 1 && inputNumber != 2){ + throw new IllegalArgumentException("[ERROR] Invalid input"); + } + return inputNumber == 1; + } +} From 3d04aa2671b0cbbeaed19b3e5eb933b4000384f7 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:39:57 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=9E=98=ED=95=91=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Result.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/Result.java diff --git a/src/main/java/Result.java b/src/main/java/Result.java new file mode 100644 index 00000000..4bdb356b --- /dev/null +++ b/src/main/java/Result.java @@ -0,0 +1,6 @@ +public record Result(int strikeCount, int ballCount) { + + public Boolean isAllStrike() { + return strikeCount == 3; + } +} From 757df6c0a4c40331dda7a40fa05d689123160488 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:40:14 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat=20:=20computer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/Computer.java | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/Computer.java diff --git a/src/main/java/Computer.java b/src/main/java/Computer.java new file mode 100644 index 00000000..55bb2513 --- /dev/null +++ b/src/main/java/Computer.java @@ -0,0 +1,49 @@ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class Computer { + private final List numbers; + + public Computer() { + numbers = generateRandomNumbers(); + } + + public Result checkNumbers(List inputNumbers) { + int strikeCount = countStrike(inputNumbers); + int ballCount = countBall(inputNumbers); + + return new Result(strikeCount, ballCount); + } + + private int countStrike(List inputNumbers) { + int count = 0; + for (int i = 0; i < numbers.size(); i++) { + if (Objects.equals(numbers.get(i), inputNumbers.get(i))) { + count++; + } + } + return count; + } + + private int countBall(List inputNumbers) { + int count = 0; + for (int i = 0; i < inputNumbers.size(); i++) { + int num = inputNumbers.get(i); + if (numbers.contains(num) && numbers.get(i) != num) { + count++; + } + } + return count; + } + + private List generateRandomNumbers() { + List numbers = new ArrayList<>(); + for (int i = 0; i <= 9; i++) { + numbers.add(i); + } + Collections.shuffle(numbers); + return numbers.subList(0, 3); + } +} From 5e563c40c507b2311a9c138dbb749797335a6483 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:40:26 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat=20:=20Output=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/Output.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/Output.java diff --git a/src/main/java/Output.java b/src/main/java/Output.java new file mode 100644 index 00000000..a5cf5d77 --- /dev/null +++ b/src/main/java/Output.java @@ -0,0 +1,16 @@ +public class Output { + public static void printResult(Result result){ + int strikeCount = result.strikeCount(); + int ballCount = result.ballCount(); + if(strikeCount > 0){ + System.out.printf("%d스트라이크 ", strikeCount); + } + if(ballCount > 0){ + System.out.printf("%d볼 ", ballCount); + } + if(strikeCount == 0 && ballCount == 0){ + System.out.print("낫싱"); + } + System.out.println(); + } +} From cf0c093a8e951ddcd500efc2e7c5ad1a495ebdb6 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:40:35 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EC=8B=A4=ED=96=89=20=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=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/Baseball.java | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/Baseball.java diff --git a/src/main/java/Baseball.java b/src/main/java/Baseball.java new file mode 100644 index 00000000..8e63e9c7 --- /dev/null +++ b/src/main/java/Baseball.java @@ -0,0 +1,30 @@ +import java.util.ArrayList; + +public class Baseball { + + public void run() { + boolean isContinue = true; + while(isContinue){ + isContinue = playGame(); + } + } + + private static boolean playGame() { + boolean isContinue; + Computer computer = new Computer(); + + while (true) { + ArrayList numbers = Input.inputNumbers(); + Result result = computer.checkNumbers(numbers); + + if (result.isAllStrike()) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 끝"); + break; + } + Output.printResult(result); + } + + isContinue = Input.inputContinue(); + return isContinue; + } +} From 9511db9501ebb1c49e83a72b6328ad80725f378b Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:40:46 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..0016013f --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + Baseball baseball = new Baseball(); + baseball.run(); + } +} From a2037bde3105da7a9d90eabe306dceeee2dcd606 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:51:08 +0900 Subject: [PATCH 07/11] =?UTF-8?q?fix=20:=20Input=20=EC=9D=98=20Scanner=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Baseball.java | 13 +++++++-- src/main/java/Input.java | 55 ++++++++++++++++++++----------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/main/java/Baseball.java b/src/main/java/Baseball.java index 8e63e9c7..7ec8a2ce 100644 --- a/src/main/java/Baseball.java +++ b/src/main/java/Baseball.java @@ -1,6 +1,13 @@ import java.util.ArrayList; +import java.util.Scanner; public class Baseball { + private final Input input; + + public Baseball() { + Scanner scanner = new Scanner(System.in); + this.input = new Input(scanner);; + } public void run() { boolean isContinue = true; @@ -9,12 +16,12 @@ public void run() { } } - private static boolean playGame() { + private boolean playGame() { boolean isContinue; Computer computer = new Computer(); while (true) { - ArrayList numbers = Input.inputNumbers(); + ArrayList numbers = input.inputNumbers(); Result result = computer.checkNumbers(numbers); if (result.isAllStrike()) { @@ -24,7 +31,7 @@ private static boolean playGame() { Output.printResult(result); } - isContinue = Input.inputContinue(); + isContinue = input.inputContinue(); return isContinue; } } diff --git a/src/main/java/Input.java b/src/main/java/Input.java index a38173e9..8e3cebaf 100644 --- a/src/main/java/Input.java +++ b/src/main/java/Input.java @@ -2,86 +2,91 @@ import java.util.Scanner; public class Input { - private static final Scanner scanner = new Scanner(System.in); - public static ArrayList inputNumbers(){ - while (true){ + private final Scanner scanner; + + public Input(Scanner scanner) { + this.scanner = scanner; + } + + public ArrayList inputNumbers() { + while (true) { try { System.out.print("숫자를 입력해주세요 : "); - String input = scanner.next(); + String input = scanner.next(); return validateInputNumber(input); - } catch (Exception e) { + } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } - public static Boolean inputContinue(){ - while (true){ + public boolean inputContinue() { + while (true) { try { System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); String input = scanner.next(); return validateContinue(input); - } catch (Exception e) { + } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } - private static ArrayList validateInputNumber(String input){ - if (input == null || input.length() != 3){ + private ArrayList validateInputNumber(String input) { + if (input == null || input.length() != 3) { throw new IllegalArgumentException("[ERROR] Invalid input"); } - if (!isAllNumbers(input)){ + if (!isAllNumbers(input)) { throw new IllegalArgumentException("[ERROR] Invalid input"); } - if (hasDuplicateNumbers(input)){ + if (hasDuplicateNumbers(input)) { throw new IllegalArgumentException("[ERROR] Invalid input"); } return convertStringToNumbers(input); } - private static Boolean isAllNumbers(String input){ - for (int i = 0; i< input.length(); i++){ - if (!Character.isDigit(input.charAt(i))){ + private boolean isAllNumbers(String input) { + for (int i = 0; i < input.length(); i++) { + if (!Character.isDigit(input.charAt(i))) { return false; } } return true; } - private static boolean hasDuplicateNumbers(String input) { - boolean[] used = new boolean[10]; // 0~9 체크용 + private boolean hasDuplicateNumbers(String input) { + boolean[] used = new boolean[10]; for (int i = 0; i < input.length(); i++) { int num = Character.getNumericValue(input.charAt(i)); if (used[num]) { - return true; // 이미 나온 숫자 + return true; } used[num] = true; } return false; } - private static ArrayList convertStringToNumbers(String input){ + private ArrayList convertStringToNumbers(String input) { ArrayList numbers = new ArrayList<>(); - for (int i = 0; i< input.length(); i++){ + for (int i = 0; i < input.length(); i++) { numbers.add(Character.getNumericValue(input.charAt(i))); } return numbers; } - private static boolean validateContinue(String input){ - if (input == null || input.length() != 1){ + private boolean validateContinue(String input) { + if (input == null || input.length() != 1) { throw new IllegalArgumentException("[ERROR] Invalid input"); } - if (!Character.isDigit(input.charAt(0))){ + if (!Character.isDigit(input.charAt(0))) { throw new IllegalArgumentException("[ERROR] Invalid input"); } int inputNumber = Character.getNumericValue(input.charAt(0)); - if (inputNumber != 1 && inputNumber != 2){ + if (inputNumber != 1 && inputNumber != 2) { throw new IllegalArgumentException("[ERROR] Invalid input"); } return inputNumber == 1; } -} +} \ No newline at end of file From 9a5e7d8321275bc6f8b1319ff90acf35715076d2 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:53:39 +0900 Subject: [PATCH 08/11] =?UTF-8?q?test=20:=20Input=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/test/java/InputTest.java | 106 +++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/test/java/InputTest.java diff --git a/src/test/java/InputTest.java b/src/test/java/InputTest.java new file mode 100644 index 00000000..96eab837 --- /dev/null +++ b/src/test/java/InputTest.java @@ -0,0 +1,106 @@ +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Scanner; + +import static org.junit.jupiter.api.Assertions.*; + +class InputTest { + + @Test + void inputNumbers_validInput_returnsDigits() { + // given + Input input = new Input(new Scanner("123\n")); + + // when + ArrayList result = input.inputNumbers(); + + // then + assertEquals(Arrays.asList(1, 2, 3), result); + } + + @Test + void inputNumbers_duplicate_thenValid_returnsValidDigits() { + // given + Input input = new Input(new Scanner("112\n789\n")); + + // when + ArrayList result = input.inputNumbers(); + + // then + assertEquals(Arrays.asList(7, 8, 9), result); + } + + @Test + void inputNumbers_nonDigit_thenValid_returnsValidDigits() { + // given + Input input = new Input(new Scanner("12a\n456\n")); + + // when + ArrayList result = input.inputNumbers(); + + // then + assertEquals(Arrays.asList(4, 5, 6), result); + } + + @Test + void inputNumbers_wrongLength_thenValid_returnsValidDigits() { + // given + Input input = new Input(new Scanner("12\n987\n")); + + // when + ArrayList result = input.inputNumbers(); + + // then + assertEquals(Arrays.asList(9, 8, 7), result); + } + + @Test + void inputContinue_input1_returnsTrue() { + // given + Input input = new Input(new Scanner("1\n")); + + // when + boolean result = input.inputContinue(); + + // then + assertTrue(result); + } + + @Test + void inputContinue_input2_returnsFalse() { + // given + Input input = new Input(new Scanner("2\n")); + + // when + boolean result = input.inputContinue(); + + // then + assertFalse(result); + } + + @Test + void inputContinue_invalid_then1_returnsTrue() { + // given + Input input = new Input(new Scanner("3\n1\n")); + + // when + boolean result = input.inputContinue(); + + // then + assertTrue(result); + } + + @Test + void inputContinue_nonDigit_then2_returnsFalse() { + // given + Input input = new Input(new Scanner("a\n2\n")); + + // when + boolean result = input.inputContinue(); + + // then + assertFalse(result); + } +} \ No newline at end of file From b12202b2e1389ba5e0ff9a366cc609dfaa953416 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 13:59:47 +0900 Subject: [PATCH 09/11] =?UTF-8?q?fix=20:=20=EC=88=AB=EC=9E=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=ED=9B=84=20Computer=20=EC=97=90=20=EC=A3=BC=EC=9E=85=ED=95=98?= =?UTF-8?q?=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 --- src/main/java/Baseball.java | 5 +++-- src/main/java/Computer.java | 15 ++------------- src/main/java/NumberGenerator.java | 5 +++++ src/main/java/RandomNumberGenerator.java | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 src/main/java/NumberGenerator.java create mode 100644 src/main/java/RandomNumberGenerator.java diff --git a/src/main/java/Baseball.java b/src/main/java/Baseball.java index 7ec8a2ce..40c8b803 100644 --- a/src/main/java/Baseball.java +++ b/src/main/java/Baseball.java @@ -17,9 +17,10 @@ public void run() { } private boolean playGame() { - boolean isContinue; - Computer computer = new Computer(); + NumberGenerator generator = new RandomNumberGenerator(); + Computer computer = new Computer(generator); + boolean isContinue; while (true) { ArrayList numbers = input.inputNumbers(); Result result = computer.checkNumbers(numbers); diff --git a/src/main/java/Computer.java b/src/main/java/Computer.java index 55bb2513..866ec707 100644 --- a/src/main/java/Computer.java +++ b/src/main/java/Computer.java @@ -1,13 +1,11 @@ -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Objects; public class Computer { private final List numbers; - public Computer() { - numbers = generateRandomNumbers(); + public Computer(NumberGenerator generator) { + this.numbers = generator.generate(); } public Result checkNumbers(List inputNumbers) { @@ -37,13 +35,4 @@ private int countBall(List inputNumbers) { } return count; } - - private List generateRandomNumbers() { - List numbers = new ArrayList<>(); - for (int i = 0; i <= 9; i++) { - numbers.add(i); - } - Collections.shuffle(numbers); - return numbers.subList(0, 3); - } } diff --git a/src/main/java/NumberGenerator.java b/src/main/java/NumberGenerator.java new file mode 100644 index 00000000..4a3caa24 --- /dev/null +++ b/src/main/java/NumberGenerator.java @@ -0,0 +1,5 @@ +import java.util.List; + +public interface NumberGenerator { + List generate(); +} diff --git a/src/main/java/RandomNumberGenerator.java b/src/main/java/RandomNumberGenerator.java new file mode 100644 index 00000000..12ea9a78 --- /dev/null +++ b/src/main/java/RandomNumberGenerator.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RandomNumberGenerator implements NumberGenerator { + + @Override + public List generate() { + List numbers = new ArrayList<>(); + for (int i = 0; i <= 9; i++) { + numbers.add(i); + } + Collections.shuffle(numbers); + return numbers.subList(0, 3); + } +} \ No newline at end of file From 2c79820a5c788e919883026cde13a5389ea0039b Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sat, 31 Jan 2026 14:06:43 +0900 Subject: [PATCH 10/11] =?UTF-8?q?test=20:=20Computer=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/test/java/ComputerTest.java | 84 +++++++++++++++++++++++++ src/test/java/FixedNumberGenerator.java | 15 +++++ 2 files changed, 99 insertions(+) create mode 100644 src/test/java/ComputerTest.java create mode 100644 src/test/java/FixedNumberGenerator.java diff --git a/src/test/java/ComputerTest.java b/src/test/java/ComputerTest.java new file mode 100644 index 00000000..f0ef00cb --- /dev/null +++ b/src/test/java/ComputerTest.java @@ -0,0 +1,84 @@ +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class ComputerTest { + @Test + void allStrike_returns3Strike0Ball() { + // given + Computer computer = new Computer( + new FixedNumberGenerator(Arrays.asList(1, 2, 3)) + ); + List input = Arrays.asList(1, 2, 3); + + // when + Result result = computer.checkNumbers(input); + + // then + assertEquals(3, result.strikeCount()); + assertEquals(0, result.ballCount()); + } + + @Test + void oneStrike_oneBall() { + // secret: 4 2 5 + // guess : 4 5 6 + Computer computer = new Computer( + new FixedNumberGenerator(Arrays.asList(4, 2, 5)) + ); + List input = Arrays.asList(4, 5, 6); + + Result result = computer.checkNumbers(input); + + assertEquals(1, result.strikeCount()); + assertEquals(1, result.ballCount()); + } + + @Test + void onlyBalls_returns0Strike2Ball() { + // secret: 4 2 5 + // guess : 2 4 6 + Computer computer = new Computer( + new FixedNumberGenerator(Arrays.asList(4, 2, 5)) + ); + List input = Arrays.asList(2, 4, 6); + + Result result = computer.checkNumbers(input); + + assertEquals(0, result.strikeCount()); + assertEquals(2, result.ballCount()); + } + + @Test + void nothing_returns0Strike0Ball() { + // secret: 4 2 5 + // guess : 7 8 9 + Computer computer = new Computer( + new FixedNumberGenerator(Arrays.asList(4, 2, 5)) + ); + List input = Arrays.asList(7, 8, 9); + + Result result = computer.checkNumbers(input); + + assertEquals(0, result.strikeCount()); + assertEquals(0, result.ballCount()); + } + + @Test + void mixedCase_returnsCorrectCounts() { + // secret: 1 2 3 + // guess : 1 3 2 + Computer computer = new Computer( + new FixedNumberGenerator(Arrays.asList(1, 2, 3)) + ); + List input = Arrays.asList(1, 3, 2); + + Result result = computer.checkNumbers(input); + + assertEquals(1, result.strikeCount()); + assertEquals(2, result.ballCount()); + } +} \ No newline at end of file diff --git a/src/test/java/FixedNumberGenerator.java b/src/test/java/FixedNumberGenerator.java new file mode 100644 index 00000000..b0a3168d --- /dev/null +++ b/src/test/java/FixedNumberGenerator.java @@ -0,0 +1,15 @@ +import java.util.List; + +public class FixedNumberGenerator implements NumberGenerator { + + private final List numbers; + + public FixedNumberGenerator(List numbers) { + this.numbers = numbers; + } + + @Override + public List generate() { + return numbers; + } +} \ No newline at end of file From 5d8d215293802d49927d51c705638f0c9096e431 Mon Sep 17 00:00:00 2001 From: koomin1227 Date: Sun, 8 Feb 2026 14:40:50 +0900 Subject: [PATCH 11/11] =?UTF-8?q?docs=20:=20README=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..871d2041 100644 --- a/README.md +++ b/README.md @@ -1 +1,48 @@ -# java-baseball-precourse \ No newline at end of file +# 숫자 야구 게임 (Baseball) + +## 📌 구현할 기능 목록 + +### 1) 게임 실행/흐름 +- 프로그램 시작 시 숫자 야구 게임을 실행한다. +- 한 게임은 “정답 3자리 생성 → 입력 반복 → 정답 시 종료 문구 출력” 흐름으로 진행한다. +- 정답을 맞히면 “3개의 숫자를 모두 맞히셨습니다! 게임 끝”을 출력하고 재시작/종료 입력 단계로 이동한다. +- 재시작(1) 선택 시 새로운 정답을 생성하고 게임을 다시 진행한다. +- 종료(2) 선택 시 프로그램을 종료한다. + +### 2) 컴퓨터 숫자 생성 +- 0~9 사이의 숫자 중 서로 다른 3개를 무작위로 뽑아 정답으로 사용한다. +- 생성된 정답은 3자리 List(Integer) 형태로 유지한다. + +### 3) 사용자 입력(숫자 3자리) +- “숫자를 입력해주세요 : ” 안내 문구를 출력한다. +- 사용자 입력은 정확히 3자리여야 한다. +- 사용자 입력은 모두 숫자여야 한다. +- 사용자 입력은 중복 숫자가 없어야 한다. +- 위 조건을 만족하지 않으면 [ERROR] Invalid input을 출력하고 다시 입력을 받는다. +- 검증이 끝나면 문자열 입력을 정수 리스트로 변환한다. + +### 4) 결과 판정(스트라이크/볼) +- 같은 위치에 같은 숫자가 있으면 스트라이크로 센다. +- 숫자는 존재하지만 위치가 다르면 볼로 센다. +- 판정 결과를 Result(strikeCount, ballCount)로 반환한다. +- 스트라이크가 3이면 정답으로 처리한다. + +### 5) 결과 출력 +- 스트라이크가 1 이상이면 “{n}스트라이크 ”를 출력한다. +- 볼이 1 이상이면 “{n}볼 ”을 출력한다. +- 스트라이크/볼이 모두 0이면 “낫싱”을 출력한다. +- 각 결과 출력은 줄바꿈으로 마무리한다. + +### 6) 재시작/종료 입력 +- “게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.”를 출력한다. +- 입력은 한 자리 숫자여야 한다. +- 입력값은 1 또는 2만 허용한다. +- 유효하지 않으면 [ERROR] Invalid input을 출력하고 다시 입력을 받는다. +- 1이면 true(계속), 2이면 false(종료)를 반환한다. + +## ▶️ 실행 방법 (예시) +1. 프로그램을 실행한다. +2. 안내 문구에 따라 3자리 숫자를 입력한다. +3. 판정 결과(볼/스트라이크/낫싱)를 확인하며 반복한다. +4. 정답을 맞히면 종료 문구가 출력된다. +5. 1을 입력하면 재시작, 2를 입력하면 종료된다.