빙고 게임 (23.06.07)

·2023년 6월 7일
0

Coding Test

목록 보기
16/39
post-thumbnail

✏️ 문제 1

  1. 빙고판 크기를 입력 받아, 그 크기 만큼의 행과 열을 가지는 2차원 배열(빙고판)을 생성하고
    1부터 크기*크기 사이의 정수 난수를 무작위 배치.
  2. 정수를 입력 받아 빙고판에서 일치하는 부분을 찾아 해당 부분의 숫자를 “★“로 변경하고
    현재 빙고 카운트가 몇인지 출력.
    단, 빙고판에 없는 정수를 입력한 경우 “다시 입력해주세요.“ 출력
  3. 가로, 세로, 대각선 한 줄이 모두 “★“로 변경되어 있을 경우 빙고 카운트를 1 증가
  4. 빙고카운트가 3이상이 되면 “Bingo!” 를 출력하고 프로그램 종료.

풀이

	public void startBingo() {
//		1. 빙고판 크기를 입력 받아, 그 크기 만큼의 행과 열을 가지는 2차원 배열(빙고판)을 생성하고
//		1부터 크기*크기 사이의 정수 난수를 무작위 배치.

		Scanner sc = new Scanner(System.in);
		
		System.out.print("빙고판 크기 지정 : ");
		int num = sc.nextInt();
		sc.nextLine();
		
		// 1차원 배열로 빙고판에 입력될 값 생성 + 중복 제거 진행
		int[] tempArr = new int[num*num]; // 1차원 배열 생성
		// num * num --> 빙고판의 크기는 가로, 세로의 곱만큼의 공간이 필요함
		
		// 중복값 제거하면서 랜덤값 집어넣기
		for(int i=0; i<tempArr.length; i++) {
			tempArr[i] = (int)(Math.random()*(num*num)) + 1;
			
			// 중복 제거
			for(int j=0; j<i; j++) {
				if(tempArr[i] == tempArr[j]) {
					i--;
					break;
				}
			}
		}
		
		// 위에서 만들어진 중복 제거한 1차원 배열을 --> 2차원 배열에 넣기
		// String 배열로 변경해서 대입 진행
		// 왜 String 배열? 빙고가 된 부분을 "★"로 변경하기 위해서
		String[][] bingoBoard = new String[num][num];
		
		int index = 0; // 1차원 배열 인덱스 지정을 위한 변수
		
		for(int i=0; i<num; i++) {
			for(int j=0; j<num; j++) {
				// 1차원 배열은 0번부터 num*num까지 반복 진행
				
				bingoBoard[i][j] = tempArr[index] + "";
				index++;
			}
		}
		
		// ------------------------------------------------------------
		
		// 랜덤 배치된 빙고판 최초 1회 출력
		
		for(int i=0; i<bingoBoard.length; i++) {
			for(int j=0; j<bingoBoard[0].length; j++) {
				System.out.printf("%4s", bingoBoard[i][j]);
			}
			System.out.println();
		}
		
//		2. 정수를 입력 받아 빙고판에서 일치하는 부분을 찾아 해당 부분의 숫자를 “★“로 변경하고
//		현재 빙고 카운트가 몇인지 출력.
//		단, 빙고판에 없는 정수를 입력한 경우 “다시 입력해주세요.“ 출력
		
		System.out.println("============빙고게임 시작============");
		
		while(true) {
			System.out.print("정수를 입력하시오 : ");
			String input = sc.nextLine();
			
			boolean flag = true; // 검색된 값이 빙고판에 있는지 확인(잘못된 입력 확인)
			for(int i=0; i<bingoBoard.length; i++) {
				for(int j=0; j<bingoBoard[0].length; j++) {
					
					// 입력된 값과 일치되는 곳을 "★" 형태로 변환
					if(bingoBoard[i][j].equals(input)) {
						bingoBoard[i][j] = "★";
						flag = false;
					}
					
					System.out.printf("%4s", bingoBoard[i][j]);
				}
				
				System.out.println();
			}
			
			if(flag) {
				System.out.println("잘못 입력하셨습니다. 다시 입력하세요.");
				continue;
			}
			
//			3. 가로, 세로, 대각선 한 줄이 모두 “★“로 변경되어 있을 경우 빙고 카운트를 1 증가

			// 빙고판의 크기에 따라
			// 빙고 기준이 되는 문자열 생성
			// ex) 5 * 5 크기 빙고 -> 한 줄이 "★★★★★"이면 빙고
		
			String bingoLine = "";
			for(int i=0; i<num; i++) {
				bingoLine += "★";
			}
			
			// 빙고 검사
			int bingoCount = 0; // 빙고 수를 저장할 변수
			
			// 가로(행) 또는 세로(열)의 문자열을 더하여 하나의 문자열로 저장
			// --> 저장된 문자열의 모양이 "★★★★★"인 경우 == 빙고
			// --> bingoCount 증가
			
			for(int i=0; i<bingoBoard.length; i++) {
				// 매 반복 시마다 row, col을 빈 문자열로 초기화
				// --> 바깥쪽 for문이 반복될 때마다 검사하는 행과 열이 이동하므로
				// 	   빙고 여부를 검사하기 위한 row, col을 빈 문자열로 초기화 해야 함
				
				String row = "";
				String col = "";
				
				for(int j=0; j<bingoBoard.length; j++) {
					 row += bingoBoard[i][j]; // 현재 행의 문자를 모두 더함
					 
					 // i, j(행렬)를 반대로 하여 열의 모든 문자를 더함
					 col += bingoBoard[j][i];
				}
				
				if(row.equals(bingoLine)) {
					bingoCount++; // 가로 빙고가 존재할 경우
				}
				if(col.equals(bingoLine)) {
					bingoCount++; // 세로 빙고가 존재할 경우
				}
			}
			
			// 대각선 빙고 여부
			// 대각선 : diagonal(다이애그널)
			
			// 대각선은 빙고판에 두 개만 존재
			// --> 대각선 문자를 더해서 저장할 변수 두 개 선언 및 빈 문자열 초기화
			String dia1 = "";
			String dia2 = "";
			
			for(int i=0; i<bingoBoard.length; i++) {
				dia1 += bingoBoard[i][i]; // 좌상 우하
				dia2 += bingoBoard[bingoBoard.length -1 -i][i]; // 우상 좌하
			}
			
			if(dia1.equals(bingoLine)) {
				bingoCount++;
			}

			if(dia2.equals(bingoLine)) {
				bingoCount++;
			}
			
			// 빙고 카운트 출력
			System.out.println("현재 " + bingoCount + "빙고");
			
//			4. 빙고카운트가 3이상이 되면 “***Bingo!***” 를 출력하고 프로그램 종료.
			if(bingoCount >= 3) {
				System.out.println("***Bingo!***");
				break;
			}
		} // while문 종료
profile
풀스택 개발자 기록집 📁

0개의 댓글