Java
숫자 야구 코딩 테스트(Java)
너랑노랑
2023. 6. 12. 22:09
package mathbaseball;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Stream;
public class MathBaseball {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
List<Integer> result = new ArrayList<Integer>();
while (true) {
int length;
System.out.println("---------------------------------------------");
System.out.println("시작 하려면 숫자의 길이를 입력 하세요");
length = scan.nextInt();
System.out.println(length);
System.out.println("---------------------------------------------");
if (length > 10) {
System.out.println("11 보다 작은 수를 입력 해 주세요");
continue;
}
int answer[] = new int[length];
for (int i = 0; i < length; i++) {
answer[i] = (int) (Math.random() * 10);
if (answer[0] == 0) {
i--;
continue;
}
for (int idx = 0; idx < i; idx++) {
if (answer[i] == answer[idx]) {
i--;
break;
}
}
}
// System.out.println("정답: "+Arrays.toString(answer));
int count = 0;
while (true) {
int strike = 0;
int ball = 0;
System.out.println(length + "자리 수 를 입력 해 주세요");
String input = scan.next();
if(input.length() > length) {
System.out.println("길이가 최대 길이보다 큽니다");
System.out.println("---------------------------------------------");
continue;
}
else if(input.length() < length) {
System.out.println("길이가 최대 길이보다 작습니다");
System.out.println("---------------------------------------------");
continue;
}
int inputToInt = Integer.parseInt(input);
try {
int[] toArray = Stream.of(String.valueOf(inputToInt).split("")).mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < length; i++) {
if (toArray[i] == answer[i]) {
strike++;
continue;
}
for (int idx = 0; idx < length; idx++) {
if (toArray[i] == answer[idx]) {
ball++;
}
}
}
} catch (Exception e) {
System.out.println("길이가 최대 길이보다 작거나 맨 앞에 0이 올 수 없습니다.");
System.out.println("---------------------------------------------");
continue;
}
count++;
System.out.println(strike + "스트라이크");
System.out.println(ball + "볼");
System.out.println("---------------------------------------------");
if (strike == length) {
System.out.println("정답입니다");
result.add(count);
break;
}
}
System.out.println("---------------------------------------------");
System.out.println("종료 하려면 quit를 계속하시려면 아무키나 입력해 주세요");
String fin = scan.next();
if (fin.equals("quit")) {
for (int i = 0; i < result.size(); i++) {
System.out.println(i + 1 + "번째 게임 시도 횟수 : " + result.get(i));
}
break;
}
}
}
}
코딩테스트 연습 겸 풀어본 숫자 야구 게임 자바 버전입니다.
일반 숫자야구와는 달리 맞추는 길이를 내가 정할 수 있고 최대 10자리 맞출 수 있게 되어있습니다.
int answer[] = new int[length];
for (int i = 0; i < length; i++) {
answer[i] = (int) (Math.random() * 10);
if (answer[0] == 0) {
i--;
continue;
}
for (int idx = 0; idx < i; idx++) {
if (answer[i] == answer[idx]) {
i--;
break;
}
}
}
랜덤 한 숫자를 만들 때 맨 앞에 0이 오면 안 되고, 숫자가 중복되면 안 된다.
if문을 통해서 0번째 인덱스의 값이 0번일 때 i값을 빼줍니다,
이중 포문을 통해 중복된 숫자들이 생성되지 않게 필터링해줍니다.
try {
int inputToInt = Integer.parseInt(input);
int[] toArray = Stream.of(String.valueOf(inputToInt).split("")).mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < length; i++) {
if (toArray[i] == answer[i]) {
strike++;
continue;
}
for (int idx = 0; idx < length; idx++) {
if (toArray[i] == answer[idx]) {
ball++;
}
}
}
} catch (Exception e) {
System.out.println("길이가 최대 길이보다 작거나 맨 앞에 0이 올 수 없습니다.");
System.out.println("---------------------------------------------");
continue;
}
입력받은 값을 만들어 비교를 할 때 입력값이 0으로 시작할 경우 inputToInt의 값이 앞의 0을 빼고 인식을 하기 때문에
ex) 입력 012 -> 12
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
at mathbaseball.MathBaseball.main(MathBaseball.java:64)
위와 같은 예외가 발생하고 예외가 발생하여도 비정상적인 종료를 막기 위해 try catch 문을 통해 예외 처리를 하였습니다.