From d55a354bcddc1a438f211490db7e2ce61fa787c4 Mon Sep 17 00:00:00 2001 From: giljin Date: Thu, 2 Mar 2023 20:24:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=ED=9B=84=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EA=B0=9C=EB=B0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 54 +++++++++++++++++++ src/main/java/baseball/Ball.java | 44 +++++++++++++++ src/main/java/baseball/BallStatus.java | 5 ++ .../java/baseball/util/ValidationUtils.java | 24 +++++++++ src/test/java/study/BallTest.java | 36 +++++++++++++ src/test/java/study/ValidationUtilsTest.java | 40 ++++++++++++++ 6 files changed, 203 insertions(+) create mode 100644 src/main/java/baseball/Ball.java create mode 100644 src/main/java/baseball/BallStatus.java create mode 100644 src/main/java/baseball/util/ValidationUtils.java create mode 100644 src/test/java/study/BallTest.java create mode 100644 src/test/java/study/ValidationUtilsTest.java diff --git a/README.md b/README.md index 8fe711203..5f2e3bd56 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,57 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` +--- +숫자야구 To Do List +* 숫자를 입력받는다 + 1. 3자리 수인지 확인 + 2. 1~9사이의 수인지 확인 + 3. 중복된 값이 있는지 확인 +* 컴퓨터의 랜덤 숫자를 만든다 + 1. 3자리 수인지 확인 + 2. 1~9사이의 수인지 확인 + 3. 중복된 값이 있는지 확인 +* 입력한 수가 스트라이크가 몇개인지 확인 +* 입련한 수가 볼이 몇개인지 확인 + +--- +수정내용 +* 숫자를 입력받는다 + 3자리 수인지 확인 -> 3자리 확인 + 숫자인지 확인 두가지 책임이 같이있으므로 분리 + 1~9사이의 수인지 확인 -> 앞에서 이미 체크한 내용이므로 제거 + +수정 후 +* 숫자를 입력받는다 + 1. 3자리 확인 + 2. 숫자인지 확인 + 3. 중복된 값이 있는지 확인 + +--- +수정내용 +* 컴퓨터의 랜덤 3자리 숫자를 만든다 + 3자리 수인지 확인 -> 입력받아서 처리하는게 아니기 때문에 필요없음 + 1~9사이의 수인지 확인 -> 입력받아서 처리하는게 아니기 때문에 필요없음 + +수정 후 +* 컴퓨터의 랜덤 3자리 숫자를 만든다 + 1. 중복된 값이 있는지 확인 +--- + +수정내용 +* 입력한 수가 스트라이크가 몇개인지 확인 +* 입련한 수가 볼이 몇개인지 확인 + 몇개인지 확인하는건 여러기능을 복합적으로 확인해야함. + +수정 후 +* 입력한 수가 스트라이크인지, 볼인지 낫띵인지 확인 + 1. 위치와 숫자가 동일하면 스트라이크 + 2. 숫자만 존재한다면 볼 + 3. 숫자가 존재하지 않다면 낫띵 +ex) +computer / user +위치, 숫자 / 위치, 숫자 +1, 1 / 1, 1 스트라이크 +1, 1 / 2, 1 볼 +1, 1 / 2, 4 낫띵 + + diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java new file mode 100644 index 000000000..d1df7d1a2 --- /dev/null +++ b/src/main/java/baseball/Ball.java @@ -0,0 +1,44 @@ +package baseball; + +import java.util.Objects; + +public class Ball { + + private final int position; + private final int number; + + public Ball(int position, int number) { + this.position = position; + this.number = number; + } + + public BallStatus play(Ball ball) { + if(this.equals(ball)){ + return BallStatus.STRIKE; + } + + if(this.matchBallNumber(ball.number)){ + return BallStatus.BALL; + } + + return BallStatus.NOTHING; + } + + public boolean matchBallNumber(int number){ + return this.number == number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Ball ball = (Ball) o; + return position == ball.position && number == ball.number; + } + + @Override + public int hashCode() { + return Objects.hash(position, number); + } + +} diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java new file mode 100644 index 000000000..fd762cf57 --- /dev/null +++ b/src/main/java/baseball/BallStatus.java @@ -0,0 +1,5 @@ +package baseball; + +public enum BallStatus { + BALL, NOTHING, STRIKE +} diff --git a/src/main/java/baseball/util/ValidationUtils.java b/src/main/java/baseball/util/ValidationUtils.java new file mode 100644 index 000000000..bb12cb9d3 --- /dev/null +++ b/src/main/java/baseball/util/ValidationUtils.java @@ -0,0 +1,24 @@ +package baseball.util; + +import java.util.List; +import java.util.regex.Pattern; + +public class ValidationUtils { + + private static final String NUMBER_REGEX = "^[0-9]*$"; + + public static boolean isNumber(String text) { + return Pattern.matches(NUMBER_REGEX, text); + } + + public static boolean macthLength(String text, int length) { + return text.length() == length; + } + + public static boolean isDuplicationNumber(List numberList) { + long distinctCount = numberList.stream() + .distinct() + .count(); + return numberList.size() == distinctCount; + } +} diff --git a/src/test/java/study/BallTest.java b/src/test/java/study/BallTest.java new file mode 100644 index 000000000..8ba6aa50e --- /dev/null +++ b/src/test/java/study/BallTest.java @@ -0,0 +1,36 @@ +package study; + +import baseball.Ball; +import baseball.BallStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class BallTest { + + private Ball computerBall; + + @BeforeEach + void setUp(){ + computerBall = new Ball(1,1); + } + + @Test + void strike(){ + Ball userBall = new Ball(1,1); + assertThat(computerBall.play(userBall)).isEqualTo(BallStatus.STRIKE); + } + + @Test + void ball(){ + Ball userBall = new Ball(2,1); + assertThat(computerBall.play(userBall)).isEqualTo(BallStatus.BALL); + } + + @Test + void nothing(){ + Ball userBall = new Ball(3,3); + assertThat(computerBall.play(userBall)).isEqualTo(BallStatus.NOTHING); + } +} diff --git a/src/test/java/study/ValidationUtilsTest.java b/src/test/java/study/ValidationUtilsTest.java new file mode 100644 index 000000000..2bb221638 --- /dev/null +++ b/src/test/java/study/ValidationUtilsTest.java @@ -0,0 +1,40 @@ +package study; + +import baseball.util.ValidationUtils; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class ValidationUtilsTest { + + @Test + void checkNumber(){ + assertThat(ValidationUtils.isNumber("2")).isTrue(); + assertThat(ValidationUtils.isNumber("s")).isFalse(); + assertThat(ValidationUtils.isNumber("223424")).isTrue(); + assertThat(ValidationUtils.isNumber("1w2")).isFalse(); + assertThat(ValidationUtils.isNumber("s1s")).isFalse(); + } + + @Test + void checkDigits(){ + assertThat(ValidationUtils.macthLength("123",3)).isTrue(); + assertThat(ValidationUtils.macthLength("123s",3)).isFalse(); + assertThat(ValidationUtils.macthLength("1",0)).isFalse(); + } + + @Test + void distinctNumber(){ + + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList(1, 1, 1))).isFalse(); + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList(1, 2, 3))).isTrue(); + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList(1, 3))).isTrue(); + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList(1, 1))).isFalse(); + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList(1))).isTrue(); + assertThat(ValidationUtils.isDuplicationNumber(Arrays.asList())).isTrue(); + } + + +} From 547f3729b650284c04c11a6a3ad253a138fd6f7b Mon Sep 17 00:00:00 2001 From: giljin Date: Tue, 7 Mar 2023 20:41:24 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=ED=9B=84=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EA=B0=9C=EB=B0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- src/main/java/baseball/Ball.java | 2 +- src/main/java/baseball/Balls.java | 27 ++++++++++++++++++++++++ src/test/java/study/BallsTest.java | 34 ++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/main/java/baseball/Balls.java create mode 100644 src/test/java/study/BallsTest.java diff --git a/README.md b/README.md index 5f2e3bd56..ac81330d5 100644 --- a/README.md +++ b/README.md @@ -77,4 +77,5 @@ computer / user 1, 1 / 2, 1 볼 1, 1 / 2, 4 낫띵 - +--- +(1,1), (2,5), (3,2) / (1,7), (2,6) , (3,5) -> 1볼 diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java index d1df7d1a2..3f935ae43 100644 --- a/src/main/java/baseball/Ball.java +++ b/src/main/java/baseball/Ball.java @@ -1,6 +1,6 @@ package baseball; -import java.util.Objects; +import java.util.*; public class Ball { diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java new file mode 100644 index 000000000..c2b3fca3d --- /dev/null +++ b/src/main/java/baseball/Balls.java @@ -0,0 +1,27 @@ +package baseball; + +import java.util.ArrayList; +import java.util.List; + +public class Balls { + + private final List results = new ArrayList<>(); + public Balls(List numbers) { + mapBall(numbers); + } + + private void mapBall(List numbers){ + for (int i = 0; i < 3; i++) { + Ball ball = new Ball(i+1, numbers.get(i)); + results.add(ball); + } + } + + public BallStatus compare(Ball ball) { + return results.stream() + .map(result -> result.play(ball)) + .filter(status -> status != BallStatus.NOTHING) + .findFirst() + .orElse(BallStatus.NOTHING); + } +} diff --git a/src/test/java/study/BallsTest.java b/src/test/java/study/BallsTest.java new file mode 100644 index 000000000..3bbad3250 --- /dev/null +++ b/src/test/java/study/BallsTest.java @@ -0,0 +1,34 @@ +package study; + +import baseball.Ball; +import baseball.BallStatus; +import baseball.Balls; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class BallsTest { + + @Test + void nothing(){ + Balls balls = new Balls(Arrays.asList(1,2,3)); + BallStatus status = balls.compare(new Ball(1,4)); + assertThat(status).isEqualTo(BallStatus.NOTHING); + } + + @Test + void ball(){ + Balls balls = new Balls(Arrays.asList(1,2,3)); + BallStatus status = balls.compare(new Ball(1,3)); + assertThat(status).isEqualTo(BallStatus.BALL); + } + + @Test + void strike(){ + Balls balls = new Balls(Arrays.asList(1,2,3)); + BallStatus status = balls.compare(new Ball(1,1)); + assertThat(status).isEqualTo(BallStatus.STRIKE); + } +} From 9e40df158085cc325652235bddeba23b0ce01219 Mon Sep 17 00:00:00 2001 From: giljin Date: Tue, 7 Mar 2023 21:11:24 +0900 Subject: [PATCH 3/4] =?UTF-8?q?BaseBallResult=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/baseball/BallStatus.java | 10 ++++++- src/main/java/baseball/Balls.java | 19 ++++++++++--- src/main/java/baseball/BaseBallResult.java | 33 ++++++++++++++++++++++ src/test/java/study/BallsTest.java | 31 ++++++++++++++++++++ 4 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 src/main/java/baseball/BaseBallResult.java diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java index fd762cf57..d609d78af 100644 --- a/src/main/java/baseball/BallStatus.java +++ b/src/main/java/baseball/BallStatus.java @@ -1,5 +1,13 @@ package baseball; public enum BallStatus { - BALL, NOTHING, STRIKE + BALL, NOTHING, STRIKE; + + public boolean isStrike() { + return this == STRIKE; + } + + public boolean isBall() { + return this == BALL; + } } diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java index c2b3fca3d..8e2adea0c 100644 --- a/src/main/java/baseball/Balls.java +++ b/src/main/java/baseball/Balls.java @@ -5,16 +5,18 @@ public class Balls { - private final List results = new ArrayList<>(); + private final List results; public Balls(List numbers) { - mapBall(numbers); + this.results = mapBall(numbers); } - private void mapBall(List numbers){ + private List mapBall(List numbers){ + List balls = new ArrayList<>(); for (int i = 0; i < 3; i++) { Ball ball = new Ball(i+1, numbers.get(i)); - results.add(ball); + balls.add(ball); } + return balls; } public BallStatus compare(Ball ball) { @@ -24,4 +26,13 @@ public BallStatus compare(Ball ball) { .findFirst() .orElse(BallStatus.NOTHING); } + + public BaseBallResult play(Balls userBalls) { + BaseBallResult result = new BaseBallResult(); + for (int i = 0; i < 3; i++) { + BallStatus status = userBalls.compare(this.results.get(i)); + result.add(status); + } + return result; + } } diff --git a/src/main/java/baseball/BaseBallResult.java b/src/main/java/baseball/BaseBallResult.java new file mode 100644 index 000000000..497141872 --- /dev/null +++ b/src/main/java/baseball/BaseBallResult.java @@ -0,0 +1,33 @@ +package baseball; + +public class BaseBallResult { + private int strikeCount = 0; + private int ballCount = 0; + + public boolean isNotThing() { + return strikeCount == 0 && ballCount == 0; + } + + public void add(BallStatus status) { + if( status.isStrike() ){ + strikeCount++; + return; + } + if( status.isBall() ){ + ballCount++; + } + + } + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + public boolean isGameOver() { + return strikeCount == 3; + } +} diff --git a/src/test/java/study/BallsTest.java b/src/test/java/study/BallsTest.java index 3bbad3250..1deb7de1f 100644 --- a/src/test/java/study/BallsTest.java +++ b/src/test/java/study/BallsTest.java @@ -3,6 +3,7 @@ import baseball.Ball; import baseball.BallStatus; import baseball.Balls; +import baseball.BaseBallResult; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -11,6 +12,36 @@ public class BallsTest { + @Test + void play_gameOver(){ + Balls computerBalls = new Balls(Arrays.asList(1,2,3)); + Balls userBalls = new Balls(Arrays.asList(1,2,3)); + BaseBallResult result = computerBalls.play(userBalls); + assertThat(result.isGameOver()).isTrue(); + } + @Test + void play_nothing(){ + Balls computerBalls = new Balls(Arrays.asList(1,2,3)); + Balls userBalls = new Balls(Arrays.asList(4,5,6)); + BaseBallResult result = computerBalls.play(userBalls); + assertThat(result.isNotThing()).isTrue(); + } + @Test + void play_one_strike_one_ball(){ + Balls computerBalls = new Balls(Arrays.asList(1,2,3)); + Balls userBalls = new Balls(Arrays.asList(1,3,6)); + BaseBallResult result = computerBalls.play(userBalls); + assertThat(result.getStrikeCount()).isEqualTo(1); + assertThat(result.getBallCount()).isEqualTo(1); + } + @Test + void play_one_strike(){ + Balls computerBalls = new Balls(Arrays.asList(1,2,3)); + Balls userBalls = new Balls(Arrays.asList(1,5,6)); + BaseBallResult result = computerBalls.play(userBalls); + assertThat(result.getStrikeCount()).isEqualTo(1); + } + @Test void nothing(){ Balls balls = new Balls(Arrays.asList(1,2,3)); From 63f6aa8ab2988b1e7e17760b803022ccca428582 Mon Sep 17 00:00:00 2001 From: giljin Date: Tue, 7 Mar 2023 21:31:51 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++++- src/main/java/Main.java | 6 ++++++ src/main/java/baseball/Balls.java | 12 ++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Main.java diff --git a/README.md b/README.md index ac81330d5..16783a175 100644 --- a/README.md +++ b/README.md @@ -78,4 +78,14 @@ computer / user 1, 1 / 2, 4 낫띵 --- -(1,1), (2,5), (3,2) / (1,7), (2,6) , (3,5) -> 1볼 +(1,1), (2,5), (3,2) / (1,7), (2,6), (3,5) -> 1볼 +(1,1), (2,5), (3,2) / (1,1), (2,6), (3,5) -> 1볼 1스트라이크 +(1,1), (2,5), (3,2) / (1,1), (2,5), (3,2) -> 3스트라이크 + +--- +* 숫자를 입력받는다 + 1. 3자리 확인 + 2. 1~9 인지 확인 + 3. 중복된 값이 있는지 확인 +* 컴퓨터의 랜덤 3자리 숫자를 만든다 + 1. 중복된 값이 있는지 확인 diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..e97021fad --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + + + } +} diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java index 8e2adea0c..823cb08f6 100644 --- a/src/main/java/baseball/Balls.java +++ b/src/main/java/baseball/Balls.java @@ -6,13 +6,21 @@ public class Balls { private final List results; + private final int MAX_SIZE = 3; public Balls(List numbers) { + checkSize(numbers); this.results = mapBall(numbers); } + private void checkSize(List numbers){ + if(numbers.size() > MAX_SIZE){ + throw new IllegalArgumentException("볼 사이즈가 올바르지 않습니다"); + } + } + private List mapBall(List numbers){ List balls = new ArrayList<>(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < MAX_SIZE; i++) { Ball ball = new Ball(i+1, numbers.get(i)); balls.add(ball); } @@ -29,7 +37,7 @@ public BallStatus compare(Ball ball) { public BaseBallResult play(Balls userBalls) { BaseBallResult result = new BaseBallResult(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < MAX_SIZE; i++) { BallStatus status = userBalls.compare(this.results.get(i)); result.add(status); }