From c2a7f38a456600b32d7207888d11c7a60ae2dcc7 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 16:51:25 +0900 Subject: [PATCH 01/19] =?UTF-8?q?docs(readme):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..47923ef1 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,49 @@ +# πŸ’ͺ ν”„λ‘œμ νŠΈ κ°œμš” + +숫자 야ꡬ κ²Œμž„ + +# κ²Œμž„ μ„€λͺ… + +- 기본적으둜 1λΆ€ν„° 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ 수둜 이루어진 3자리의 수λ₯Ό λ§žμΆ”λŠ” κ²Œμž„μ΄λ‹€. +- 같은 μˆ˜κ°€ 같은 μžλ¦¬μ— 있으면 슀트라이크, λ‹€λ₯Έ μžλ¦¬μ— 있으면 λ³Ό, 같은 μˆ˜κ°€ μ „ν˜€ μ—†μœΌλ©΄ 포볼 λ˜λŠ” λ‚«μ‹±μ΄λž€ 힌트λ₯Ό +μ–»κ³ , κ·Έ 힌트λ₯Ό μ΄μš©ν•΄μ„œ λ¨Όμ € μƒλŒ€λ°©(컴퓨터)의 수λ₯Ό λ§žμΆ”λ©΄ μŠΉλ¦¬ν•œλ‹€. +- [예] μƒλŒ€λ°©(컴퓨터)의 μˆ˜κ°€ 425일 λ•Œ, 123을 μ œμ‹œν•œ 경우 : 1슀트라이크, 456을 μ œμ‹œν•œ 경우 : 1슀트라이크 1λ³Ό, +789λ₯Ό μ œμ‹œν•œ 경우 : λ‚«μ‹± +- μœ„ 숫자 μ•Όκ΅¬κ²Œμž„μ—μ„œ μƒλŒ€λ°©μ˜ 역할을 컴퓨터가 ν•œλ‹€. μ»΄ν“¨ν„°λŠ” 1μ—μ„œ 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ μž„μ˜μ˜ 수 3개λ₯Ό μ„ νƒν•œλ‹€. 게 +μž„ ν”Œλ ˆμ΄μ–΄λŠ” 컴퓨터가 μƒκ°ν•˜κ³  μžˆλŠ” 3개의 숫자λ₯Ό μž…λ ₯ν•˜κ³ , μ»΄ν“¨ν„°λŠ” μž…λ ₯ν•œ μˆ«μžμ— λŒ€ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. +- 이 같은 과정을 λ°˜λ³΅ν•΄ 컴퓨터가 μ„ νƒν•œ 3개의 숫자λ₯Ό λͺ¨λ‘ 맞히면 κ²Œμž„μ΄ μ’…λ£Œλœλ‹€. +- κ²Œμž„μ„ μ’…λ£Œν•œ ν›„ κ²Œμž„μ„ λ‹€μ‹œ μ‹œμž‘ν•˜κ±°λ‚˜ μ™„μ „νžˆ μ’…λ£Œν•  수 μžˆλ‹€. +- μ‚¬μš©μžκ°€ 잘λͺ»λœ 값을 μž…λ ₯ν•  경우 [ERROR]둜 μ‹œμž‘ν•˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ³  κ²Œμž„μ„ 계속 μ§„ν–‰ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. + +# πŸ“ κ΅¬ν˜„ κΈ°λŠ₯ λͺ©λ‘ + +### κ²Œμž„ μ€€λΉ„ κΈ°λŠ₯ +- [ ] μ»΄ν“¨ν„°λŠ” 1μ—μ„œ 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ μž„μ˜μ˜ 수 3개λ₯Ό μ„ νƒν•˜κ³  μ €μž₯ν•œλ‹€. + +### μ‚¬μš©μž μž…λ ₯ κΈ°λŠ₯ +- [ ] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] 숫자 3개λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. +- [ ] μž…λ ₯값을 κ²€μ¦ν•œλ‹€. + - [ ] 빈 λ¬Έμžμ—΄μ΄λ‚˜ 곡백이면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] μž…λ ₯이 μˆ«μžκ°€ 3κ°œκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] μˆ«μžμ— 0이 ν¬ν•¨λ˜μ–΄ 있으면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. + +### κ²Œμž„ κΈ°λŠ₯ +- [ ] κ²°κ³Όλ₯Ό νŒλ‹¨ν•œλ‹€. + - [ ] μŠ€νŠΈλΌμ΄ν¬μ™€ λ³Ό 갯수λ₯Ό μ„Όλ‹€. + - [ ] 같은 μˆ˜κ°€ 같은 μžλ¦¬μ— 있으면 슀트라이크λ₯Ό μΆ”κ°€ν•œλ‹€. + - [ ] 같은 μˆ˜κ°€ λ‹€λ₯Έ μžλ¦¬μ— 있으면 볼을 μΆ”κ°€ν•œλ‹€. + - [ ] μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 μ—†μœΌλ©΄ λ‚«μ‹±μœΌλ‘œ νŒλ‹¨ν•œλ‹€. +- [ ] κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] 정닡이 μ•„λ‹ˆλ©΄ `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. + +### κ²Œμž„ μ’…λ£Œ κΈ°λŠ₯ +- [ ] `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝`λ₯Ό 좜λ ₯ν•˜κ³  μ’…λ£Œν•œλ‹€. +- [ ] `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] μ‚¬μš©μžμ—κ²Œ 1 λ˜λŠ” 2λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. +- [ ] λ‹€λ₯Έ 값인 κ²½μš°μ—λŠ” μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. +- [ ] 1을 μž…λ ₯받은 경우 κ²Œμž„ μ€€λΉ„ κΈ°λŠ₯λΆ€ν„° κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•œλ‹€. +- [ ] 2λ₯Ό μž…λ ₯받은 경우 κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. From 59032d4abe803f91a6e0af1fb186222d88bc9272 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 16:52:34 +0900 Subject: [PATCH 02/19] =?UTF-8?q?feat(InputView):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=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 --- docs/README.md | 5 ++-- src/main/java/.gitkeep | 0 src/main/java/baseball/Application.java | 15 ++++++++++ .../controller/BaseballController.java | 29 +++++++++++++++++++ .../global/exception/CustomException.java | 13 +++++++++ .../baseball/global/message/ErrorMessage.java | 16 ++++++++++ .../baseball/global/message/InputMessage.java | 17 +++++++++++ src/main/java/baseball/view/InputView.java | 15 ++++++++++ src/main/java/baseball/view/OutputView.java | 7 +++++ 9 files changed, 115 insertions(+), 2 deletions(-) delete mode 100644 src/main/java/.gitkeep create mode 100644 src/main/java/baseball/Application.java create mode 100644 src/main/java/baseball/controller/BaseballController.java create mode 100644 src/main/java/baseball/global/exception/CustomException.java create mode 100644 src/main/java/baseball/global/message/ErrorMessage.java create mode 100644 src/main/java/baseball/global/message/InputMessage.java create mode 100644 src/main/java/baseball/view/InputView.java create mode 100644 src/main/java/baseball/view/OutputView.java diff --git a/docs/README.md b/docs/README.md index 47923ef1..a3ceb43d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,12 +21,13 @@ - [ ] μ»΄ν“¨ν„°λŠ” 1μ—μ„œ 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ μž„μ˜μ˜ 수 3개λ₯Ό μ„ νƒν•˜κ³  μ €μž₯ν•œλ‹€. ### μ‚¬μš©μž μž…λ ₯ κΈ°λŠ₯ -- [ ] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] 숫자 3개λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. +- [x] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 λ°›λŠ”λ‹€. - [ ] μž…λ ₯값을 κ²€μ¦ν•œλ‹€. - [ ] 빈 λ¬Έμžμ—΄μ΄λ‚˜ 곡백이면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [ ] μž…λ ₯이 μˆ«μžκ°€ 3κ°œκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [ ] μˆ«μžμ— 0이 ν¬ν•¨λ˜μ–΄ 있으면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] 숫자 3κ°œκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [ ] μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java new file mode 100644 index 00000000..5287d248 --- /dev/null +++ b/src/main/java/baseball/Application.java @@ -0,0 +1,15 @@ +package baseball; + +import baseball.controller.BaseballController; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class Application { + public static void main(String[] args) { + BaseballController baseballController = new BaseballController( + new InputView(), + new OutputView() + ); + baseballController.run(); + } +} \ No newline at end of file diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java new file mode 100644 index 00000000..4bb56097 --- /dev/null +++ b/src/main/java/baseball/controller/BaseballController.java @@ -0,0 +1,29 @@ +package baseball.controller; + +import baseball.global.exception.CustomException; +import baseball.global.message.InputMessage; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class BaseballController { + private final InputView inputView; + private final OutputView outputView; + + public BaseballController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + requestNumbers(); + } + + private void requestNumbers() { + outputView.printlnMessage(InputMessage.INPUT_NUMBERS.getMessage()); + try { + inputView.enterNumbers(); + } catch (CustomException e) { + + } + } +} diff --git a/src/main/java/baseball/global/exception/CustomException.java b/src/main/java/baseball/global/exception/CustomException.java new file mode 100644 index 00000000..8fd4dfd1 --- /dev/null +++ b/src/main/java/baseball/global/exception/CustomException.java @@ -0,0 +1,13 @@ +package baseball.global.exception; + +import baseball.global.message.ErrorMessage; + +public class CustomException extends IllegalArgumentException { + private CustomException(ErrorMessage errorMessage) { + super(errorMessage.getMessage()); + } + + public static CustomException of(ErrorMessage errorMessage) { + return new CustomException(errorMessage); + } +} \ No newline at end of file diff --git a/src/main/java/baseball/global/message/ErrorMessage.java b/src/main/java/baseball/global/message/ErrorMessage.java new file mode 100644 index 00000000..42e3f578 --- /dev/null +++ b/src/main/java/baseball/global/message/ErrorMessage.java @@ -0,0 +1,16 @@ +package baseball.global.message; + +public enum ErrorMessage { + ; + + private final static String PREFIX = "[ERROR]"; + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return PREFIX + " " + this.message; + } +} diff --git a/src/main/java/baseball/global/message/InputMessage.java b/src/main/java/baseball/global/message/InputMessage.java new file mode 100644 index 00000000..a425cd1e --- /dev/null +++ b/src/main/java/baseball/global/message/InputMessage.java @@ -0,0 +1,17 @@ +package baseball.global.message; + +public enum InputMessage { + + INPUT_NUMBERS("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :") + ; + + private String message; + + InputMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 00000000..294776f3 --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,15 @@ +package baseball.view; + +import java.io.Console; +import java.util.Scanner; + +public class InputView { + public void enterNumbers() { + String input = readLine(); + } + + private String readLine() { + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 00000000..29033afd --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,7 @@ +package baseball.view; + +public class OutputView { + public void printlnMessage(String message) { + System.out.println(message); + } +} From 9ec5388df79ecaca0d0691f4f9f5134f96ca851b Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 17:17:18 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat(InputView):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=A6=9D=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 --- docs/README.md | 10 ++-- .../baseball/global/message/ErrorMessage.java | 5 ++ src/main/java/baseball/view/InputView.java | 55 ++++++++++++++++++- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index a3ceb43d..5c34865f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,11 +24,11 @@ - [x] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 λ°›λŠ”λ‹€. - [ ] μž…λ ₯값을 κ²€μ¦ν•œλ‹€. - - [ ] 빈 λ¬Έμžμ—΄μ΄λ‚˜ 곡백이면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] μž…λ ₯이 μˆ«μžκ°€ 3κ°œκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] μˆ«μžμ— 0이 ν¬ν•¨λ˜μ–΄ 있으면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] 숫자 3κ°œκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] 빈 λ¬Έμžμ—΄μ΄λ‚˜ 곡백이면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] μž…λ ₯된 λ¬Έμžμ—΄μ˜ 길이가 3이 μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] 3개 쀑에 ν•˜λ‚˜λΌλ„ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] μˆ«μžμ— 0이 ν¬ν•¨λ˜μ–΄ 있으면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. ### κ²Œμž„ κΈ°λŠ₯ diff --git a/src/main/java/baseball/global/message/ErrorMessage.java b/src/main/java/baseball/global/message/ErrorMessage.java index 42e3f578..6fc813fb 100644 --- a/src/main/java/baseball/global/message/ErrorMessage.java +++ b/src/main/java/baseball/global/message/ErrorMessage.java @@ -1,6 +1,11 @@ package baseball.global.message; public enum ErrorMessage { + BLANK_INPUT("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."), + INVALID_INPUT_LENGTH("3개λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”"), + NON_DIGIT_CHARACTER_FOUND("λͺ¨λ‘ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”"), + NON_POSITIVE_NUMBER_FOUND("λͺ¨λ‘ 0보닀 큰 μ–‘μˆ˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”."), + DUPLICATE_NUMBER_FOUND("μ„œλ‘œ λ‹€λ₯Έ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”."), ; private final static String PREFIX = "[ERROR]"; diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 294776f3..49fe939e 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,11 +1,62 @@ package baseball.view; -import java.io.Console; +import baseball.global.exception.CustomException; +import baseball.global.message.ErrorMessage; + import java.util.Scanner; public class InputView { - public void enterNumbers() { + public int[] enterNumbers() { String input = readLine(); + validateStringFormat(input); + int[] nums = validateNumberFormat(input); + return nums; + } + + private void validateStringFormat(String str) { + if (isEmptyOrBlank(str)) { + throw CustomException.of(ErrorMessage.BLANK_INPUT); + } + if (str.length() != 3) { + throw CustomException.of(ErrorMessage.INVALID_INPUT_LENGTH); + } + } + + private int[] validateNumberFormat(String str) { + int[] nums = new int[3]; + for (int i = 0; i < 3; i++) { + validateDigit(str.charAt(i)); + int num = str.charAt(i) - '0'; + validatePositiveNumber(num); + } + validateDuplicate(nums); + return nums; + } + + private void validateDigit(char c) { + if (!Character.isDigit(c)) { + throw CustomException.of(ErrorMessage.NON_DIGIT_CHARACTER_FOUND); + } + } + + private void validatePositiveNumber(int num) { + if (num <= 0) { + throw CustomException.of(ErrorMessage.NON_POSITIVE_NUMBER_FOUND); + } + } + + private void validateDuplicate(int[] arr) { + if (hasDuplicate(arr)) { + throw CustomException.of(ErrorMessage.DUPLICATE_NUMBER_FOUND); + } + } + + private boolean isEmptyOrBlank(String str) { + return str == null || str.isBlank(); + } + + public static boolean hasDuplicate(int[] arr) { + return arr[0] == arr[1] || arr[0] == arr[2] || arr[1] == arr[2]; } private String readLine() { From ec0ec0574bdb32b9777e402fcef54804423a8866 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 17:23:04 +0900 Subject: [PATCH 04/19] =?UTF-8?q?feat(OuputView):=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=9C=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EC=97=90=20=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EB=8B=A4=EC=8B=9C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- .../java/baseball/controller/BaseballController.java | 10 +++++++--- src/main/java/baseball/domain/Numbers.java | 6 ++++++ src/main/java/baseball/view/OutputView.java | 9 +++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/main/java/baseball/domain/Numbers.java diff --git a/docs/README.md b/docs/README.md index 5c34865f..a0fd726c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,13 +23,13 @@ ### μ‚¬μš©μž μž…λ ₯ κΈ°λŠ₯ - [x] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. - [x] μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 λ°›λŠ”λ‹€. -- [ ] μž…λ ₯값을 κ²€μ¦ν•œλ‹€. +- [x] μž…λ ₯값을 κ²€μ¦ν•œλ‹€. - [x] 빈 λ¬Έμžμ—΄μ΄λ‚˜ 곡백이면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [x] μž…λ ₯된 λ¬Έμžμ—΄μ˜ 길이가 3이 μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [x] 3개 쀑에 ν•˜λ‚˜λΌλ„ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [x] μˆ«μžμ— 0이 ν¬ν•¨λ˜μ–΄ 있으면 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - [x] μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. + - [x] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. ### κ²Œμž„ κΈ°λŠ₯ - [ ] κ²°κ³Όλ₯Ό νŒλ‹¨ν•œλ‹€. diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 4bb56097..fbf520d3 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,5 +1,6 @@ package baseball.controller; +import baseball.domain.Numbers; import baseball.global.exception.CustomException; import baseball.global.message.InputMessage; import baseball.view.InputView; @@ -18,12 +19,15 @@ public void run() { requestNumbers(); } - private void requestNumbers() { + private Numbers requestNumbers() { outputView.printlnMessage(InputMessage.INPUT_NUMBERS.getMessage()); try { - inputView.enterNumbers(); + Numbers numbers = new Numbers(inputView.enterNumbers()); + outputView.printEmptyLine(); + return numbers; } catch (CustomException e) { - + outputView.printlnMessageWithEmptyLine(e.getMessage()); + return requestNumbers(); } } } diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java new file mode 100644 index 00000000..2ceedd76 --- /dev/null +++ b/src/main/java/baseball/domain/Numbers.java @@ -0,0 +1,6 @@ +package baseball.domain; + +public class Numbers { + public Numbers(int[] arr) { + } +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 29033afd..266e7ef9 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -4,4 +4,13 @@ public class OutputView { public void printlnMessage(String message) { System.out.println(message); } + + public void printEmptyLine() { + System.out.println(); + } + + public void printlnMessageWithEmptyLine(String message) { + printlnMessage(message); + printEmptyLine(); + } } From 6776d0b43d5373e8045a7d1a000aab351337f44d Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 17:35:18 +0900 Subject: [PATCH 05/19] =?UTF-8?q?feat(ComputerNumbers):=20=EC=BB=B4?= =?UTF-8?q?=ED=93=A8=ED=84=B0=EC=9D=98=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- docs/README.md | 2 +- .../controller/BaseballController.java | 4 +++- .../java/baseball/domain/ComputerNumbers.java | 24 +++++++++++++++++++ src/main/java/baseball/domain/Number.java | 9 +++++++ src/main/java/baseball/domain/Numbers.java | 13 ++++++++++ .../java/baseball/domain/UserNumbers.java | 4 ++++ 6 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/main/java/baseball/domain/ComputerNumbers.java create mode 100644 src/main/java/baseball/domain/Number.java create mode 100644 src/main/java/baseball/domain/UserNumbers.java diff --git a/docs/README.md b/docs/README.md index a0fd726c..93ef8767 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ # πŸ“ κ΅¬ν˜„ κΈ°λŠ₯ λͺ©λ‘ ### κ²Œμž„ μ€€λΉ„ κΈ°λŠ₯ -- [ ] μ»΄ν“¨ν„°λŠ” 1μ—μ„œ 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ μž„μ˜μ˜ 수 3개λ₯Ό μ„ νƒν•˜κ³  μ €μž₯ν•œλ‹€. +- [x] μ»΄ν“¨ν„°λŠ” 1μ—μ„œ 9κΉŒμ§€ μ„œλ‘œ λ‹€λ₯Έ μž„μ˜μ˜ 수 3개λ₯Ό μ„ νƒν•˜κ³  μ €μž₯ν•œλ‹€. ### μ‚¬μš©μž μž…λ ₯ κΈ°λŠ₯ - [x] `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•œλ‹€. diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index fbf520d3..e02b2972 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,5 +1,6 @@ package baseball.controller; +import baseball.domain.ComputerNumbers; import baseball.domain.Numbers; import baseball.global.exception.CustomException; import baseball.global.message.InputMessage; @@ -16,7 +17,8 @@ public BaseballController(InputView inputView, OutputView outputView) { } public void run() { - requestNumbers(); + ComputerNumbers computerNumbers = new ComputerNumbers(); + Numbers inputNumbers = requestNumbers(); } private Numbers requestNumbers() { diff --git a/src/main/java/baseball/domain/ComputerNumbers.java b/src/main/java/baseball/domain/ComputerNumbers.java new file mode 100644 index 00000000..66fab256 --- /dev/null +++ b/src/main/java/baseball/domain/ComputerNumbers.java @@ -0,0 +1,24 @@ +package baseball.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ComputerNumbers { + private final Numbers numbers; + + public ComputerNumbers() { + int[] randomNumbers = generateRandomNumbers(); + this.numbers = new Numbers(randomNumbers); + } + + private int[] generateRandomNumbers() { + List allNumbers = new ArrayList<>(); + for (int i = 1; i <= 9; i++) { + allNumbers.add(i); + } + Collections.shuffle(allNumbers); + int[] result = {allNumbers.get(0), allNumbers.get(1), allNumbers.get(2)}; + return result; + } +} diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java new file mode 100644 index 00000000..8a542400 --- /dev/null +++ b/src/main/java/baseball/domain/Number.java @@ -0,0 +1,9 @@ +package baseball.domain; + +public class Number { + private final int num; + + public Number(int num) { + this.num = num; + } +} diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java index 2ceedd76..c0e5348b 100644 --- a/src/main/java/baseball/domain/Numbers.java +++ b/src/main/java/baseball/domain/Numbers.java @@ -1,6 +1,19 @@ package baseball.domain; +import java.util.ArrayList; +import java.util.List; + public class Numbers { + private final List numbers; + public Numbers(int[] arr) { + numbers = new ArrayList<>(); + for (int num : arr) { + numbers.add(new Number(num)); + } + } + + private void result() { + } } diff --git a/src/main/java/baseball/domain/UserNumbers.java b/src/main/java/baseball/domain/UserNumbers.java new file mode 100644 index 00000000..06ac46d4 --- /dev/null +++ b/src/main/java/baseball/domain/UserNumbers.java @@ -0,0 +1,4 @@ +package baseball.domain; + +public class UserNumbers { +} From 9c2bd7b50add6d73919bee75d2a3a57d77c1afed Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:02:03 +0900 Subject: [PATCH 06/19] =?UTF-8?q?feat(Result):=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EB=A5=BC=20=ED=8C=90=EB=8B=A8=ED=95=98=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 --- docs/README.md | 10 +++---- .../controller/BaseballController.java | 2 ++ .../java/baseball/domain/ComputerNumbers.java | 8 ++++++ src/main/java/baseball/domain/Number.java | 4 +++ src/main/java/baseball/domain/Numbers.java | 17 +++++++++++ src/main/java/baseball/domain/Result.java | 28 +++++++++++++++++++ src/main/java/baseball/domain/ResultType.java | 14 ++++++++++ 7 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/baseball/domain/Result.java create mode 100644 src/main/java/baseball/domain/ResultType.java diff --git a/docs/README.md b/docs/README.md index 93ef8767..fbadaf55 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,11 +32,11 @@ - [x] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. ### κ²Œμž„ κΈ°λŠ₯ -- [ ] κ²°κ³Όλ₯Ό νŒλ‹¨ν•œλ‹€. - - [ ] μŠ€νŠΈλΌμ΄ν¬μ™€ λ³Ό 갯수λ₯Ό μ„Όλ‹€. - - [ ] 같은 μˆ˜κ°€ 같은 μžλ¦¬μ— 있으면 슀트라이크λ₯Ό μΆ”κ°€ν•œλ‹€. - - [ ] 같은 μˆ˜κ°€ λ‹€λ₯Έ μžλ¦¬μ— 있으면 볼을 μΆ”κ°€ν•œλ‹€. - - [ ] μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 μ—†μœΌλ©΄ λ‚«μ‹±μœΌλ‘œ νŒλ‹¨ν•œλ‹€. +- [x] κ²°κ³Όλ₯Ό νŒλ‹¨ν•œλ‹€. + - [x] μŠ€νŠΈλΌμ΄ν¬μ™€ λ³Ό 갯수λ₯Ό μ„Όλ‹€. + - [x] 같은 μˆ˜κ°€ 같은 μžλ¦¬μ— 있으면 슀트라이크λ₯Ό μΆ”κ°€ν•œλ‹€. + - [x] 같은 μˆ˜κ°€ λ‹€λ₯Έ μžλ¦¬μ— 있으면 볼을 μΆ”κ°€ν•œλ‹€. + - [x] μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 μ—†μœΌλ©΄ λ‚«μ‹±μœΌλ‘œ νŒλ‹¨ν•œλ‹€. - [ ] κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. - [ ] 정닡이 μ•„λ‹ˆλ©΄ `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index e02b2972..150a1b88 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -2,6 +2,7 @@ import baseball.domain.ComputerNumbers; import baseball.domain.Numbers; +import baseball.domain.Result; import baseball.global.exception.CustomException; import baseball.global.message.InputMessage; import baseball.view.InputView; @@ -19,6 +20,7 @@ public BaseballController(InputView inputView, OutputView outputView) { public void run() { ComputerNumbers computerNumbers = new ComputerNumbers(); Numbers inputNumbers = requestNumbers(); + Result result = new Result(computerNumbers, inputNumbers); } private Numbers requestNumbers() { diff --git a/src/main/java/baseball/domain/ComputerNumbers.java b/src/main/java/baseball/domain/ComputerNumbers.java index 66fab256..f9b37026 100644 --- a/src/main/java/baseball/domain/ComputerNumbers.java +++ b/src/main/java/baseball/domain/ComputerNumbers.java @@ -21,4 +21,12 @@ private int[] generateRandomNumbers() { int[] result = {allNumbers.get(0), allNumbers.get(1), allNumbers.get(2)}; return result; } + + public Number get(int idx) { + return numbers.get(idx); + } + + public boolean notContain(Number number) { + return numbers.notContain(number); + } } diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 8a542400..3c90f774 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -6,4 +6,8 @@ public class Number { public Number(int num) { this.num = num; } + + public boolean isSameValue(Number number) { + return this.num == number.num; + } } diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java index c0e5348b..a4ee89c3 100644 --- a/src/main/java/baseball/domain/Numbers.java +++ b/src/main/java/baseball/domain/Numbers.java @@ -16,4 +16,21 @@ public Numbers(int[] arr) { private void result() { } + + public Number get(int idx) { + return numbers.get(idx); + } + + public boolean notContain(Number inputNumber) { + for (Number number: numbers) { + if (number.isSameValue(inputNumber)) { + return false; + } + } + return true; + } + + public int size() { + return numbers.size(); + } } diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java new file mode 100644 index 00000000..1294d887 --- /dev/null +++ b/src/main/java/baseball/domain/Result.java @@ -0,0 +1,28 @@ +package baseball.domain; + +public class Result { + + private final ResultType resultType; + private final int strike; + private final int ball; + + public Result(ComputerNumbers computerNumbers, Numbers inputNumbers) { + int strike = 0; + int ball = 0; + for (int idx = 0; idx < inputNumbers.size(); idx++) { + Number number = inputNumbers.get(idx); + if (computerNumbers.notContain(number)) { + continue; + } + if (number.isSameValue(computerNumbers.get(idx))) { + strike++; + continue; + } + ball++; + } + this.strike = strike; + this.ball = ball; + this.resultType = ResultType.getResult(strike, ball); + } + +} diff --git a/src/main/java/baseball/domain/ResultType.java b/src/main/java/baseball/domain/ResultType.java new file mode 100644 index 00000000..9ed623be --- /dev/null +++ b/src/main/java/baseball/domain/ResultType.java @@ -0,0 +1,14 @@ +package baseball.domain; + +public enum ResultType { + STRIKE_AND_BALL, + NOTHING + ; + + public static ResultType getResult(int strike, int ball) { + if (strike == 0 && ball == 0) { + return NOTHING; + } + return STRIKE_AND_BALL; + } +} From e6ec55fda12f0d7bf609bd583b20112fac0f056a Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:11:48 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feat(OutputView):=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC=20=EB=B0=8F=20=EB=B3=BC=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=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 --- docs/README.md | 2 +- .../controller/BaseballController.java | 16 ++++++++++- src/main/java/baseball/domain/Result.java | 11 ++++++++ src/main/java/baseball/domain/ResultType.java | 10 ++++--- src/main/java/baseball/view/OutputView.java | 27 +++++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index fbadaf55..c27ce467 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,7 +37,7 @@ - [x] 같은 μˆ˜κ°€ 같은 μžλ¦¬μ— 있으면 슀트라이크λ₯Ό μΆ”κ°€ν•œλ‹€. - [x] 같은 μˆ˜κ°€ λ‹€λ₯Έ μžλ¦¬μ— 있으면 볼을 μΆ”κ°€ν•œλ‹€. - [x] μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 μ—†μœΌλ©΄ λ‚«μ‹±μœΌλ‘œ νŒλ‹¨ν•œλ‹€. -- [ ] κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. - [ ] 정닡이 μ•„λ‹ˆλ©΄ `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. ### κ²Œμž„ μ’…λ£Œ κΈ°λŠ₯ diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 150a1b88..4cb26ac6 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -3,6 +3,7 @@ import baseball.domain.ComputerNumbers; import baseball.domain.Numbers; import baseball.domain.Result; +import baseball.domain.ResultType; import baseball.global.exception.CustomException; import baseball.global.message.InputMessage; import baseball.view.InputView; @@ -20,7 +21,6 @@ public BaseballController(InputView inputView, OutputView outputView) { public void run() { ComputerNumbers computerNumbers = new ComputerNumbers(); Numbers inputNumbers = requestNumbers(); - Result result = new Result(computerNumbers, inputNumbers); } private Numbers requestNumbers() { @@ -34,4 +34,18 @@ private Numbers requestNumbers() { return requestNumbers(); } } + + private void checkResult(ComputerNumbers computerNumbers, Numbers inputNumbers) { + Result result = new Result(computerNumbers, inputNumbers); + outputView.printStrikeAndBall(result); + if (result.getResultType() == ResultType.THREE_STRIKE) { + outputView.printThreeStrikeResult(result); + return; + } + if (result.getResultType() == ResultType.STRIKE_AND_BALL) { + + return; + } + + } } diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 1294d887..5c47a248 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -25,4 +25,15 @@ public Result(ComputerNumbers computerNumbers, Numbers inputNumbers) { this.resultType = ResultType.getResult(strike, ball); } + public ResultType getResultType() { + return resultType; + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } } diff --git a/src/main/java/baseball/domain/ResultType.java b/src/main/java/baseball/domain/ResultType.java index 9ed623be..f58c2a45 100644 --- a/src/main/java/baseball/domain/ResultType.java +++ b/src/main/java/baseball/domain/ResultType.java @@ -1,14 +1,18 @@ package baseball.domain; public enum ResultType { + THREE_STRIKE, STRIKE_AND_BALL, NOTHING ; public static ResultType getResult(int strike, int ball) { - if (strike == 0 && ball == 0) { - return NOTHING; + if (strike == 3) { + return THREE_STRIKE; } - return STRIKE_AND_BALL; + if (strike != 0 || ball != 0) { + return STRIKE_AND_BALL; + } + return NOTHING; } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 266e7ef9..87d920e3 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,5 +1,8 @@ package baseball.view; +import baseball.domain.Result; +import baseball.domain.ResultType; + public class OutputView { public void printlnMessage(String message) { System.out.println(message); @@ -13,4 +16,28 @@ public void printlnMessageWithEmptyLine(String message) { printlnMessage(message); printEmptyLine(); } + + public void printStrikeAndBall(Result result) { + if (result.getResultType() == ResultType.STRIKE_AND_BALL) { + StringBuilder sb = new StringBuilder(); + appendStrike(result, sb); + appendBall(result, sb); + printlnMessage(sb.toString()); + } + } + + private void appendStrike(Result result, StringBuilder sb) { + if (result.getStrike() != 0) { + sb.append(result.getStrike()).append("슀트라이크"); + } + } + + private void appendBall(Result result, StringBuilder sb) { + if (result.getBall() != 0) { + if (!sb.isEmpty()) { + sb.append(" "); + } + sb.append(result.getBall()).append("λ³Ό"); + } + } } From 4b09589b02a0d02488f31c74bb6162a85cf5203f Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:29:20 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat(BaseballController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 16 +++++------ .../controller/BaseballController.java | 28 +++++++++---------- .../baseball/global/message/ErrorMessage.java | 1 + src/main/java/baseball/view/InputView.java | 16 +++++++++++ src/main/java/baseball/view/OutputView.java | 7 ++++- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/docs/README.md b/docs/README.md index c27ce467..6a2a10a3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -38,13 +38,13 @@ - [x] 같은 μˆ˜κ°€ λ‹€λ₯Έ μžλ¦¬μ— 있으면 볼을 μΆ”κ°€ν•œλ‹€. - [x] μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 μ—†μœΌλ©΄ λ‚«μ‹±μœΌλ‘œ νŒλ‹¨ν•œλ‹€. - [x] κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] 정닡이 μ•„λ‹ˆλ©΄ `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. +- [x] 정닡이 μ•„λ‹ˆλ©΄ `숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :`λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μž…λ ₯을 λ°›λŠ”λ‹€. ### κ²Œμž„ μ’…λ£Œ κΈ°λŠ₯ -- [ ] `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝`λ₯Ό 좜λ ₯ν•˜κ³  μ’…λ£Œν•œλ‹€. -- [ ] `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] μ‚¬μš©μžμ—κ²Œ 1 λ˜λŠ” 2λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. -- [ ] λ‹€λ₯Έ 값인 κ²½μš°μ—λŠ” μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. -- [ ] 1을 μž…λ ₯받은 경우 κ²Œμž„ μ€€λΉ„ κΈ°λŠ₯λΆ€ν„° κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•œλ‹€. -- [ ] 2λ₯Ό μž…λ ₯받은 경우 κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. +- [x] `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝`λ₯Ό 좜λ ₯ν•˜κ³  μ’…λ£Œν•œλ‹€. +- [x] `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μ‚¬μš©μžμ—κ²Œ 1 λ˜λŠ” 2λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. +- [x] λ‹€λ₯Έ 값인 κ²½μš°μ—λŠ” μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œ κ²½μš°μ—λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œ 후에 μž…λ ₯을 λ‹€μ‹œ λ°›λŠ”λ‹€. +- [x] 1을 μž…λ ₯받은 경우 κ²Œμž„ μ€€λΉ„ κΈ°λŠ₯λΆ€ν„° κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•œλ‹€. +- [x] 2λ₯Ό μž…λ ₯받은 경우 κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 4cb26ac6..b0c6240e 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -20,7 +20,21 @@ public BaseballController(InputView inputView, OutputView outputView) { public void run() { ComputerNumbers computerNumbers = new ComputerNumbers(); + process(computerNumbers); + } + + public void process(ComputerNumbers computerNumbers) { Numbers inputNumbers = requestNumbers(); + Result result = new Result(computerNumbers, inputNumbers); + outputView.printlnStrikeAndBall(result); + if (result.getResultType() != ResultType.THREE_STRIKE) { + process(computerNumbers); + return; + } + outputView.printlnThreeStrike(); + if (inputView.enterFinishType() == 1) { + run(); + } } private Numbers requestNumbers() { @@ -34,18 +48,4 @@ private Numbers requestNumbers() { return requestNumbers(); } } - - private void checkResult(ComputerNumbers computerNumbers, Numbers inputNumbers) { - Result result = new Result(computerNumbers, inputNumbers); - outputView.printStrikeAndBall(result); - if (result.getResultType() == ResultType.THREE_STRIKE) { - outputView.printThreeStrikeResult(result); - return; - } - if (result.getResultType() == ResultType.STRIKE_AND_BALL) { - - return; - } - - } } diff --git a/src/main/java/baseball/global/message/ErrorMessage.java b/src/main/java/baseball/global/message/ErrorMessage.java index 6fc813fb..43dcb3a2 100644 --- a/src/main/java/baseball/global/message/ErrorMessage.java +++ b/src/main/java/baseball/global/message/ErrorMessage.java @@ -6,6 +6,7 @@ public enum ErrorMessage { NON_DIGIT_CHARACTER_FOUND("λͺ¨λ‘ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”"), NON_POSITIVE_NUMBER_FOUND("λͺ¨λ‘ 0보닀 큰 μ–‘μˆ˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”."), DUPLICATE_NUMBER_FOUND("μ„œλ‘œ λ‹€λ₯Έ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”."), + INVALID_FINISH_INPUT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.") ; private final static String PREFIX = "[ERROR]"; diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 49fe939e..3ae30cd0 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -63,4 +63,20 @@ private String readLine() { Scanner scanner = new Scanner(System.in); return scanner.nextLine(); } + + public int enterFinishType() { + String input = readLine(); + if (input.length() != 1) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + char c = input.charAt(0); + if (!Character.isDigit(c)) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + int num = input.charAt(0) - '0'; + if (num != 0 && num != 1) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + return num; + } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 87d920e3..e2ff8e61 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -17,7 +17,7 @@ public void printlnMessageWithEmptyLine(String message) { printEmptyLine(); } - public void printStrikeAndBall(Result result) { + public void printlnStrikeAndBall(Result result) { if (result.getResultType() == ResultType.STRIKE_AND_BALL) { StringBuilder sb = new StringBuilder(); appendStrike(result, sb); @@ -40,4 +40,9 @@ private void appendBall(Result result, StringBuilder sb) { sb.append(result.getBall()).append("λ³Ό"); } } + + public void printlnThreeStrike() { + System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝"); + System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + } } From 52ca44a784b9871cbde444977ebfc003f0ae5003 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:31:05 +0900 Subject: [PATCH 09/19] =?UTF-8?q?refac(InputMessage):=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EC=95=88=EB=82=B4=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=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/controller/BaseballController.java | 2 +- src/main/java/baseball/global/message/InputMessage.java | 2 +- src/main/java/baseball/view/OutputView.java | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index b0c6240e..db493453 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -38,7 +38,7 @@ public void process(ComputerNumbers computerNumbers) { } private Numbers requestNumbers() { - outputView.printlnMessage(InputMessage.INPUT_NUMBERS.getMessage()); + outputView.printMessage(InputMessage.INPUT_NUMBERS.getMessage()); try { Numbers numbers = new Numbers(inputView.enterNumbers()); outputView.printEmptyLine(); diff --git a/src/main/java/baseball/global/message/InputMessage.java b/src/main/java/baseball/global/message/InputMessage.java index a425cd1e..fd41ed23 100644 --- a/src/main/java/baseball/global/message/InputMessage.java +++ b/src/main/java/baseball/global/message/InputMessage.java @@ -2,7 +2,7 @@ public enum InputMessage { - INPUT_NUMBERS("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” :") + INPUT_NUMBERS("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : ") ; private String message; diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index e2ff8e61..2bb315a8 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -8,6 +8,10 @@ public void printlnMessage(String message) { System.out.println(message); } + public void printMessage(String message) { + System.out.print(message); + } + public void printEmptyLine() { System.out.println(); } From a5e57b1b8b8a7c25d22b599e81ad5010644269b3 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:32:56 +0900 Subject: [PATCH 10/19] =?UTF-8?q?refac(InputView):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=90=9C=20=EC=88=AB=EC=9E=90=20=EC=A0=80=EC=9E=A5=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/InputView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 3ae30cd0..435940f4 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -28,6 +28,7 @@ private int[] validateNumberFormat(String str) { validateDigit(str.charAt(i)); int num = str.charAt(i) - '0'; validatePositiveNumber(num); + nums[i] = num; } validateDuplicate(nums); return nums; From d13b35552d10092eebbd7a254fc1438ade6639dd Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:35:04 +0900 Subject: [PATCH 11/19] =?UTF-8?q?refac(InputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=EC=8B=9C=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EC=88=AB=EC=9E=90=20=EB=A1=9C=EC=A7=81=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=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/view/InputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 435940f4..d0d23a14 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -75,7 +75,7 @@ public int enterFinishType() { throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); } int num = input.charAt(0) - '0'; - if (num != 0 && num != 1) { + if (num != 1 && num != 2) { throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); } return num; From 1c8267464bc330cbc1170917af7893d1a1ffc83d Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:39:11 +0900 Subject: [PATCH 12/19] =?UTF-8?q?refac(Numbers):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Numbers.java | 4 ---- src/main/java/baseball/domain/UserNumbers.java | 4 ---- 2 files changed, 8 deletions(-) delete mode 100644 src/main/java/baseball/domain/UserNumbers.java diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java index a4ee89c3..219a7078 100644 --- a/src/main/java/baseball/domain/Numbers.java +++ b/src/main/java/baseball/domain/Numbers.java @@ -13,10 +13,6 @@ public Numbers(int[] arr) { } } - private void result() { - - } - public Number get(int idx) { return numbers.get(idx); } diff --git a/src/main/java/baseball/domain/UserNumbers.java b/src/main/java/baseball/domain/UserNumbers.java deleted file mode 100644 index 06ac46d4..00000000 --- a/src/main/java/baseball/domain/UserNumbers.java +++ /dev/null @@ -1,4 +0,0 @@ -package baseball.domain; - -public class UserNumbers { -} From 7855fb5359d208f22035fecd5a537b03a7509a27 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:44:32 +0900 Subject: [PATCH 13/19] =?UTF-8?q?refac(InputView):=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=9C=84=EC=B9=98=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/baseball/view/InputView.java | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index d0d23a14..39426b64 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -6,6 +6,7 @@ import java.util.Scanner; public class InputView { + public int[] enterNumbers() { String input = readLine(); validateStringFormat(input); @@ -13,6 +14,22 @@ public int[] enterNumbers() { return nums; } + public int enterFinishType() { + String input = readLine(); + if (input.length() != 1) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + char c = input.charAt(0); + if (!Character.isDigit(c)) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + int num = input.charAt(0) - '0'; + if (num != 1 && num != 2) { + throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); + } + return num; + } + private void validateStringFormat(String str) { if (isEmptyOrBlank(str)) { throw CustomException.of(ErrorMessage.BLANK_INPUT); @@ -56,7 +73,7 @@ private boolean isEmptyOrBlank(String str) { return str == null || str.isBlank(); } - public static boolean hasDuplicate(int[] arr) { + private static boolean hasDuplicate(int[] arr) { return arr[0] == arr[1] || arr[0] == arr[2] || arr[1] == arr[2]; } @@ -64,20 +81,4 @@ private String readLine() { Scanner scanner = new Scanner(System.in); return scanner.nextLine(); } - - public int enterFinishType() { - String input = readLine(); - if (input.length() != 1) { - throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); - } - char c = input.charAt(0); - if (!Character.isDigit(c)) { - throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); - } - int num = input.charAt(0) - '0'; - if (num != 1 && num != 2) { - throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); - } - return num; - } } From d0dcf1d04381ab0545fce5a1267bd17a16721883 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:47:30 +0900 Subject: [PATCH 14/19] =?UTF-8?q?refac(OutputView):=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9=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/view/OutputView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 2bb315a8..ea5b1e03 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -46,7 +46,7 @@ private void appendBall(Result result, StringBuilder sb) { } public void printlnThreeStrike() { - System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝"); - System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + printlnMessage("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝"); + printlnMessage("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); } } From 77ce253edb5f36a64564decb3705fd41055dceb0 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:48:39 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refac(OutputView):=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC=20=EB=B3=BC=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=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/view/OutputView.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index ea5b1e03..b4e4a842 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -22,12 +22,10 @@ public void printlnMessageWithEmptyLine(String message) { } public void printlnStrikeAndBall(Result result) { - if (result.getResultType() == ResultType.STRIKE_AND_BALL) { - StringBuilder sb = new StringBuilder(); - appendStrike(result, sb); - appendBall(result, sb); - printlnMessage(sb.toString()); - } + StringBuilder sb = new StringBuilder(); + appendStrike(result, sb); + appendBall(result, sb); + printlnMessage(sb.toString()); } private void appendStrike(Result result, StringBuilder sb) { From 57d0c3871ff5ab9c083740fa8b2a829baf343aca Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:52:54 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refac(InputView):=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=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/baseball/view/InputView.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 39426b64..a76a6c69 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -16,11 +16,12 @@ public int[] enterNumbers() { public int enterFinishType() { String input = readLine(); - if (input.length() != 1) { - throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); - } - char c = input.charAt(0); - if (!Character.isDigit(c)) { + int num = parseFinishType(input); + return num; + } + + private int parseFinishType(String input) { + if (input.length() != 1 || !Character.isDigit(input.charAt(0))) { throw CustomException.of(ErrorMessage.INVALID_FINISH_INPUT); } int num = input.charAt(0) - '0'; From f680c1f005dc04877434a3b7978d25ec792b748a Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Wed, 28 Jan 2026 18:56:35 +0900 Subject: [PATCH 17/19] =?UTF-8?q?refac(OutputView):=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=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/view/OutputView.java | 29 ++++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index b4e4a842..f1bda9d8 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -23,28 +23,31 @@ public void printlnMessageWithEmptyLine(String message) { public void printlnStrikeAndBall(Result result) { StringBuilder sb = new StringBuilder(); - appendStrike(result, sb); - appendBall(result, sb); + appendStrike(result.getStrike(), sb); + appendBall(result.getBall(), sb); + if (sb.isEmpty()) { + printlnMessage("λ‚«μ‹±"); + } printlnMessage(sb.toString()); } - private void appendStrike(Result result, StringBuilder sb) { - if (result.getStrike() != 0) { - sb.append(result.getStrike()).append("슀트라이크"); + public void printlnThreeStrike() { + printlnMessage("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝"); + printlnMessage("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + } + + private void appendStrike(int strike, StringBuilder sb) { + if (strike != 0) { + sb.append(strike).append("슀트라이크"); } } - private void appendBall(Result result, StringBuilder sb) { - if (result.getBall() != 0) { + private void appendBall(int ball, StringBuilder sb) { + if (ball != 0) { if (!sb.isEmpty()) { sb.append(" "); } - sb.append(result.getBall()).append("λ³Ό"); + sb.append(ball).append("λ³Ό"); } } - - public void printlnThreeStrike() { - printlnMessage("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ 끝"); - printlnMessage("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); - } } From 4452c1b24153527516963fb42c7ea4ac547c8813 Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Mon, 2 Feb 2026 18:47:38 +0900 Subject: [PATCH 18/19] =?UTF-8?q?refac(OutputView):=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=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/controller/BaseballController.java | 3 +-- src/main/java/baseball/view/OutputView.java | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index db493453..e0312d6f 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -41,10 +41,9 @@ private Numbers requestNumbers() { outputView.printMessage(InputMessage.INPUT_NUMBERS.getMessage()); try { Numbers numbers = new Numbers(inputView.enterNumbers()); - outputView.printEmptyLine(); return numbers; } catch (CustomException e) { - outputView.printlnMessageWithEmptyLine(e.getMessage()); + outputView.printlnMessage(e.getMessage()); return requestNumbers(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index f1bda9d8..54c46f4e 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -22,12 +22,13 @@ public void printlnMessageWithEmptyLine(String message) { } public void printlnStrikeAndBall(Result result) { + if (result.getResultType() == ResultType.NOTHING) { + printlnMessage("λ‚«μ‹±"); + return; + } StringBuilder sb = new StringBuilder(); appendStrike(result.getStrike(), sb); appendBall(result.getBall(), sb); - if (sb.isEmpty()) { - printlnMessage("λ‚«μ‹±"); - } printlnMessage(sb.toString()); } From 25e0a8a361730f3c69924cd93f4acef5a5b2f55b Mon Sep 17 00:00:00 2001 From: YouTaegeun Date: Fri, 6 Feb 2026 18:48:35 +0900 Subject: [PATCH 19/19] =?UTF-8?q?test(NumberTest):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/domain/ComputerNumbersTest.java | 27 +++++++++ src/test/java/baseball/domain/NumberTest.java | 24 ++++++++ .../java/baseball/domain/NumbersTest.java | 48 +++++++++++++++ src/test/java/baseball/domain/ResultTest.java | 59 +++++++++++++++++++ .../java/baseball/domain/ResultTypeTest.java | 30 ++++++++++ 5 files changed, 188 insertions(+) create mode 100644 src/test/java/baseball/domain/ComputerNumbersTest.java create mode 100644 src/test/java/baseball/domain/NumberTest.java create mode 100644 src/test/java/baseball/domain/NumbersTest.java create mode 100644 src/test/java/baseball/domain/ResultTest.java create mode 100644 src/test/java/baseball/domain/ResultTypeTest.java diff --git a/src/test/java/baseball/domain/ComputerNumbersTest.java b/src/test/java/baseball/domain/ComputerNumbersTest.java new file mode 100644 index 00000000..e0c528c4 --- /dev/null +++ b/src/test/java/baseball/domain/ComputerNumbersTest.java @@ -0,0 +1,27 @@ +package baseball.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class ComputerNumbersTest { + + @Test + void notContain_returnsFalse_forExistingNumberInstance() { + ComputerNumbers computerNumbers = new ComputerNumbers(); + + Number existingNumber = computerNumbers.get(0); + + assertThat(computerNumbers.notContain(existingNumber)).isFalse(); + } + + @Test + void get_throwsIndexOutOfBounds_whenIndexIsInvalid() { + ComputerNumbers computerNumbers = new ComputerNumbers(); + + assertThatThrownBy(() -> computerNumbers.get(3)) + .isInstanceOf(IndexOutOfBoundsException.class) + .hasMessageMatching("Index[: ]\\d+.*(Size|length)[: ]\\d+"); + } +} diff --git a/src/test/java/baseball/domain/NumberTest.java b/src/test/java/baseball/domain/NumberTest.java new file mode 100644 index 00000000..077a5bd7 --- /dev/null +++ b/src/test/java/baseball/domain/NumberTest.java @@ -0,0 +1,24 @@ +package baseball.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class NumberTest { + + @Test + void isSameValue_returnsTrue_whenValuesMatch() { + Number number = new Number(5); + Number sameValue = new Number(5); + + assertThat(number.isSameValue(sameValue)).isTrue(); + } + + @Test + void isSameValue_returnsFalse_whenValuesDoNotMatch() { + Number number = new Number(5); + Number differentValue = new Number(7); + + assertThat(number.isSameValue(differentValue)).isFalse(); + } +} diff --git a/src/test/java/baseball/domain/NumbersTest.java b/src/test/java/baseball/domain/NumbersTest.java new file mode 100644 index 00000000..9c1d2bae --- /dev/null +++ b/src/test/java/baseball/domain/NumbersTest.java @@ -0,0 +1,48 @@ +package baseball.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class NumbersTest { + + @Test + void size_returnsLengthOfInputArray() { + Numbers numbers = new Numbers(new int[]{1, 2, 3}); + + assertThat(numbers.size()).isEqualTo(3); + } + + @Test + void get_returnsNumberAtIndex() { + Numbers numbers = new Numbers(new int[]{1, 2, 3}); + + Number number = numbers.get(0); + + assertThat(number.isSameValue(new Number(1))).isTrue(); + } + + @Test + void notContain_returnsFalse_whenNumberExists() { + Numbers numbers = new Numbers(new int[]{1, 2, 3}); + + assertThat(numbers.notContain(new Number(2))).isFalse(); + } + + @Test + void notContain_returnsTrue_whenNumberDoesNotExist() { + Numbers numbers = new Numbers(new int[]{1, 2, 3}); + + assertThat(numbers.notContain(new Number(9))).isTrue(); + } + + @Test + void get_throwsIndexOutOfBounds_whenIndexIsInvalid() { + Numbers numbers = new Numbers(new int[]{1, 2}); + + assertThatExceptionOfType(IndexOutOfBoundsException.class) + .isThrownBy(() -> numbers.get(2)) + .withMessageMatching("Index[: ]\\d+.*(Size|length)[: ]\\d+"); + } +} diff --git a/src/test/java/baseball/domain/ResultTest.java b/src/test/java/baseball/domain/ResultTest.java new file mode 100644 index 00000000..e268cd33 --- /dev/null +++ b/src/test/java/baseball/domain/ResultTest.java @@ -0,0 +1,59 @@ +package baseball.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ResultTest { + + private ComputerNumbers fixedComputerNumbers(int[] values) { + Numbers numbers = new Numbers(values); + return new ComputerNumbers() { + @Override + public Number get(int idx) { + return numbers.get(idx); + } + + @Override + public boolean notContain(Number number) { + return numbers.notContain(number); + } + }; + } + + @Test + void result_countsThreeStrike_whenAllMatchInPosition() { + ComputerNumbers computerNumbers = fixedComputerNumbers(new int[]{1, 2, 3}); + Numbers inputNumbers = new Numbers(new int[]{1, 2, 3}); + + Result result = new Result(computerNumbers, inputNumbers); + + assertThat(result.getStrike()).isEqualTo(3); + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getResultType()).isEqualTo(ResultType.THREE_STRIKE); + } + + @Test + void result_countsStrikeAndBall_whenValuesMatchDifferentPositions() { + ComputerNumbers computerNumbers = fixedComputerNumbers(new int[]{1, 2, 3}); + Numbers inputNumbers = new Numbers(new int[]{1, 3, 2}); + + Result result = new Result(computerNumbers, inputNumbers); + + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getBall()).isEqualTo(2); + assertThat(result.getResultType()).isEqualTo(ResultType.STRIKE_AND_BALL); + } + + @Test + void result_countsNothing_whenNoValuesMatch() { + ComputerNumbers computerNumbers = fixedComputerNumbers(new int[]{1, 2, 3}); + Numbers inputNumbers = new Numbers(new int[]{4, 5, 6}); + + Result result = new Result(computerNumbers, inputNumbers); + + assertThat(result.getStrike()).isEqualTo(0); + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getResultType()).isEqualTo(ResultType.NOTHING); + } +} diff --git a/src/test/java/baseball/domain/ResultTypeTest.java b/src/test/java/baseball/domain/ResultTypeTest.java new file mode 100644 index 00000000..1128f8a9 --- /dev/null +++ b/src/test/java/baseball/domain/ResultTypeTest.java @@ -0,0 +1,30 @@ +package baseball.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ResultTypeTest { + + @Test + void getResult_returnsThreeStrike_whenStrikeIsThree() { + ResultType result = ResultType.getResult(3, 0); + + assertEquals(ResultType.THREE_STRIKE, result); + assertThat(result).isEqualTo(ResultType.THREE_STRIKE); + } + + @Test + void getResult_returnsStrikeAndBall_whenAnyStrikeOrBall() { + assertThat(ResultType.getResult(1, 0)).isEqualTo(ResultType.STRIKE_AND_BALL); + assertThat(ResultType.getResult(0, 2)).isEqualTo(ResultType.STRIKE_AND_BALL); + } + + @Test + void getResult_returnsNothing_whenNoStrikeAndNoBall() { + ResultType result = ResultType.getResult(0, 0); + + assertEquals(ResultType.NOTHING, result); + } +}