1부터 9까지 중복되지 않는 무작위의 3자리 숫자가 주어지고
세자리 숫자를 입력했을 때 겹치는 숫자가 있으면 Ball
숫자와 자리 위치도 동일하면 Strike로
정확하게 숫자를 맞추면 성공인 숫자야구게임을 만들어야한다.
그냥 무식하게 만들면 어려운것은 아니지만
들여쓰기를 한번으로 제한하고(중복문 사용 안하기)
메서드는 한가지 기능만 하도록 만들고
else예약어를 사용하지 않아야 하는 등 조건이 있다.
그렇다고 한번에 구현할 실력은 되지 않으니 무식한 코드로 시작하고자 한다
3월 30일
public class NumberMaker {
public static String Maker(){
String number = "";
int[] ballArr = {1,2,3,4,5,6,7,8,9};
int[] ball3 = new int[3];
for (int i = 0; i < ballArr.length; i++) {
int j = (int) (Math.random() * ballArr.length);
int tmp = 0;
tmp = ballArr[i];
ballArr[i] = ballArr[j];
ballArr[j] = tmp;
}
for (int i = 0; i < ball3.length; i++) {
ball3[i] = ballArr[i];
}
for (int i = 0; i < ball3.length; i++) {
number += ball3[i];
}
return number;
}
}
무작위의 3자리 숫자를 만드는 메서드를 만들었다.
처음에는 중복을 신경쓰지않고 숫자를 만든 다음, 중복이 있으면 교체하는 방식으로 만들어보려다
전에 자바의 정석에서 배운 로또번호 추첨을 떠올려서 순서를 바꾸는 형식으로 무작위 수를 만들었다.
import java.util.Scanner;
public class BaseballMain {
public static void main(String[] args) {
String number = NumberMaker.Maker();
boolean stopper = true;
playGame(number,stopper);
}
private static void playGame(String number,boolean stopper) {
int Strike = 0;
int Ball = 0;
//숫자 생성
do {
System.out.print("숫자를 입력해 주세요 : ");
Scanner sc = new Scanner(System.in);
String answer = sc.nextLine();
char[] numbers = number.toCharArray();
char[] answers = answer.toCharArray();
//스트라이크,볼 감별기
for (int i = 0; i < 3; i++) {
if (numbers[i]==answers[i]){
Strike++;
}
if (numbers[i]!=answers[i]){
if (answers[0]==numbers[i]){
Ball++;
}
if (answers[1]==numbers[i]){
Ball++;
}
if (answers[2]==numbers[i]){
Ball++;
}
}
}
if (answer.equals(number)){
System.out.println("정답입니다!!");
stopper = false;
return;
}
System.out.println("오답입니다...");
if (!(Strike==0&&Ball==0))
System.out.println(Strike + " 스트라이크 " + Ball + " 볼");
Strike = 0;
Ball = 0;
} while (stopper);
}
}
나름 객체지향을 해보겠다고 무지하게 메서드를 추출해낸 모습이다.
또 엄청나게 들여쓰기가 되어있고 중복도 많다.
일단 동작은 하는데 예외처리를 하지 않아 숫자를 잘못입력하면 오류가 난다.
| 숫자를 입력해 주세요 : 123 오답입니다... 0 스트라이크 2 볼 숫자를 입력해 주세요 : 234 오답입니다... 0 스트라이크 2 볼 숫자를 입력해 주세요 : 326 오답입니다... 0 스트라이크 1 볼 숫자를 입력해 주세요 : 124 오답입니다... 0 스트라이크 3 볼 숫자를 입력해 주세요 : 421 오답입니다... 1 스트라이크 2 볼 숫자를 입력해 주세요 : 214 오답입니다... 0 스트라이크 3 볼 숫자를 입력해 주세요 : 241 오답입니다... 0 스트라이크 3 볼 숫자를 입력해 주세요 : 412 정답입니다!! |
4월 4일
가장 중복이 되는 부분부터 해결해야겠다
for (int i = 0; i < 3; i++) {
if (numbers[i]==answers[i]){
Strike++;
}
if (numbers[i]!=answers[i]){
if (answers[0]==numbers[i]){
Ball++;
}
if (answers[1]==numbers[i]){
Ball++;
}
if (answers[2]==numbers[i]){
Ball++;
}
}
}
똑같은 문자들이 계속 반복되고 무엇보다 반복문안의 조건문안의 반복문이라는 너무 복잡한 구조다
우선 중복 if가 문제라는 것을 알았다.
A,B양자택일의 상황에서 A가 아니면 무조건 B일텐데 위에는 B인 경우도 가정을 해버렸다.
for (int i = 0; i < 3; i++) {
if (numbers[i]==answers[i]){
Strike++;
continue;
}
if (answers[0]==numbers[i]){
Ball++;
}if (answers[1]==numbers[i]){
Ball++;
}if (answers[2]==numbers[i]){
Ball++;
}
}
중복조건문이 사라졌다. 이제 Ball카운터를 손봐야한다
아직도 do문 안에 for문 안에 if문이라서 보기좋지않다. 메서드로 추출해야할 필요가있다.
피드백
- 아무것도 없는 상태에서 새로 만드는 것 보다
기존 것에 새로운 것을 적용해서 리팩토링하는게 몇배 더 힘들다
- 요구사항을 분석하고, 테스트를 만들기 쉬운 것 부터 만들면서 거꾸로 구현하기(테스트->프로덕트)
실패하는 코드를 만든 후 성공시키고 리팩토링
- 테스트 데이터는 경계값으로 하는게 효율적이다.
'개발자일지 > 코딩테스트' 카테고리의 다른 글
| 백준 - 2908 상수 (0) | 2022.04.27 |
|---|---|
| 백준 - 1110 더하기 싸이클 (0) | 2022.04.26 |
| 백준 - 1152번 단어의 개수 (0) | 2022.04.12 |
| NEXT STEP - 사칙연산 계산기 만들기(미완) (0) | 2022.03.18 |
| 프로그래머스 - 신규 아이디 추천(lv1) 과 정규표현식 (0) | 2022.02.18 |