본문 바로가기

국비교육/국비교육 복습

!Day08_array2d_Test08 : 지뢰 찾기 + 자신 근처 지뢰 갯수 카운트 (★★★★)

(Q) 다음 규칙에 따라 지뢰찾기를 만드세요
- 9x9 크기의 정수 배열을 준비합니다
- 지뢰는 9로 표시하며, 배열 내에 무작위로 20개가 배치됩니다
- 배치된 이후 전체 지도를 출력하세요

 

package day08;

import java.util.Random;

public class Day08_array2d_Test08 {
	
	public static void main(String[] args) {
		
		// 행과 열 입력
		int row = 9;
		int column = 9;
		
		// 배열 생성
		int[][] array = new int[row][column];
		
		Random r = new Random();
		
		// 지뢰(숫자 9) 20개 랜덤 배치
		int mineCount = 0;
		for(int i = 0 ; i < 20 ; i ++) {
			int x = r.nextInt(9);
			int y = r.nextInt(9);
			if(array[x][y] == 0) {
				array[x][y] = 9;
				mineCount ++;
			}
			else {
				i --;
			}
		}
		
		// 설치된 지뢰의 갯수 확인
		System.out.println(mineCount);
		
		// 출력
		for(int i = 0 ; i < row ; i ++) {
			for(int j = 0 ; j < column ; j ++) {
				System.out.printf(array[i][j] + " " ); 
			}
			System.out.println();
		}
	}
}

 


(추가 문제)
- 지뢰를 제외한 나머지 칸은 자신을 제외한 반경 8칸의 지뢰 개수를 세어 숫자를 기록해야 합니다
- 가장자리에 있는 칸의 경우 배열을 벗어나는 부분을 제외하고 계산해야 합니다
- 반경에 지뢰가 하나도 없다면 0이 설정됩니다

 

 

 

 

 

 

 

 

 

** 

package day08;

import java.util.Random;

public class Day08_array2d_Test08_3 {
	
	public static void main(String[] args) {
		
		// 행과 열 입력
		int row = 9;
		int column = 9;
		
		// 배열 생성
		int[][] array = new int[row][column];
		
		Random r = new Random();
		
		// 지뢰(숫자 9) 20개 랜덤 배치
		int mineCount = 0;
		for(int i = 0 ; i < 20 ; i ++) {
			int x = r.nextInt(9);
			int y = r.nextInt(9);
			if(array[x][y] == 0) {
				array[x][y] = 9;
				mineCount ++;
			}
			else {
				i --;
			}
		}
		
		// 설치된 지뢰의 갯수 확인
		System.out.println(mineCount);
		
		// (추가문제) 자신을 제외한 자신 주변 8방향의 지뢰 갯수 총합 카운트
		// 지뢰의 오른쪽 칸에 +1 하기
		for(int j = 0 ; j < array.length ; j ++) {
			for(int i = 0 ; i < array.length ; i ++) {
				if(i < array.length - 1) {
					if(array[j][i] == 9) {
						if(array[j][i+1] == 9) {
							array[j][i+1] += 0;
						}
						else {
							array[j][i+1] += 1;
				}
					}
					else {
						array[j][i+1] += 0;
					}
				}
				else if(i == array.length - 1) {
					break;
				}
			}
		}
				
		// 지뢰의 왼쪽 칸에 +1 하기
		for(int j = 0 ; j < array.length ; j ++) {
			for(int i = array.length - 1 ; i >= 0 ; i --) {
				if(i > 0) {
					if(array[j][i] == 9) {
						if(array[j][i-1] == 9) {
							array[j][i-1] += 0;
						}
						else {
							array[j][i-1] += 1;
						}
					}
					else {
								array[j][i-1] += 0;
					}
				}
				else if(i == 0) {
					break;
				}
			}
		}
				
				
				
		// 지뢰의 아래쪽 칸에 +1 하기
		for(int i = 0 ; i < array.length ; i ++) {
			for(int j = 0 ; j < array.length ; j ++) {
				if(j < array.length - 1) {
					if(array[j][i] == 9) {
						if(array[j+1][i] == 9) {
							array[j+1][i] += 0;
						}
						else {
							array[j+1][i] += 1;
						}
					}
					else {
						array[j+1][i] += 0;
					}
				}
				else if(j == array.length - 1) {
					break;
				}
			}
		}
				
		// 지뢰의 위쪽 칸에 +1 하기
		for(int i = 0 ; i < array.length ; i ++) {
			for(int j = array.length - 1 ; j >= 0 ; j --) {
				if(j > 0) {
					if(array[j][i] == 9) {
						if(array[j-1][i] == 9) {
							array[j-1][i] += 0;
						}
						else {
							array[j-1][i] += 1;
						}
					}
					else {
						array[j-1][i] += 0;
					}
				}
				else if(j == 0) {
					break;
				}
			}
		}
				
		// 지뢰의 오른쪽 대각선 아래 칸에 +1 하기 
		for(int j = 0 ; j < array.length ; j ++) {
			for(int i = 0 ; i < array.length ; i ++) {
				if(i == array.length - 1 || j == array.length - 1) {
					break;
				}
				else {
					if(array[j][i] == 9) {
						if(array[j+1][i+1] == 9) {
							array[j+1][i+1] += 0;
						}
						else {
							array[j+1][i+1] += 1;
						}
					}
					else {
						array[j+1][i+1] += 0;
					}
				}
			}
		}
				
		// 지뢰의 오른쪽 대각선 위쪽 칸에 +1 하기
		for(int i = 0 ; i < array.length ; i ++) {
			if(i == array.length - 1) {
				break;
			}
			else {
				for(int j = array.length - 1 ; j >= 0 ; j --) {
					if(j == 0) {
						break;
					}
					else {
						if(array[j][i] == 9) {
							if(array[j-1][i+1] == 9) {
								array[j-1][i+1] += 0;
							}
							else {
								array[j-1][i+1] += 1;
							}
						}
						else {
							array[j-1][i+1] += 0;
						}
					}
				}
			}
		}
				
		// 지뢰의 왼쪽 대각선 아래 칸에 +1 하기 
		for(int j = 0 ; j < array.length ; j ++) {
			if(j == array.length - 1) {
				break;
			}
			else {
				for(int i = array.length - 1 ; i >= 0 ; i --) {
					if(i == 0) {
						break;
					}
					else {
						if(array[j][i] == 9) {
							if(array[j+1][i-1] == 9) {
								array[j+1][i-1] += 0;
							}
							else {
								array[j+1][i-1] += 1;
							}
						}
						else {
						array[j+1][i-1] += 0;
						}
					}
				}
			}
		}
				
		// 지뢰의 왼쪽 대각선 위쪽 칸에 +1 하기 
		for(int j = array.length - 1 ; j >= 0 ; j --) {
			if(j == 0) {
				break;
			}
			else {
				for(int i = array.length - 1 ; i >= 0 ; i --) {
					if(i == 0) {
						break;
					}
					else {
						if(array[j][i] == 9) {
							if(array[j-1][i-1] == 9) {
								array[j-1][i-1] += 0;
							}
							else {
								array[j-1][i-1] += 1;
							}
						}
						else {
							array[j-1][i-1] += 0;
						}
					}
				}
			}
		}
		
		// 출력
		for(int i = 0 ; i < row ; i ++) {
			for(int j = 0 ; j < column ; j ++) {
				System.out.printf(array[i][j] + " " ); 
			}
			System.out.println();
		}
	}
}