본문 바로가기

Java

숫자 야구 코딩 테스트(Java)

 

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 문을 통해 예외 처리를 하였습니다.