풀이
( 이클립스로 재코딩하였습니다. )
import java.util.Scanner;
public class javatest {
static int x1 = 0, y1 = 0; // 배열 행/열
static int time = 0, resultx = 0, resulty = 0; // 시간, 결과 - 행/열
static int check = 0; // 반복 변수
static String[] strarr = null; // 입력받은 값
static int[][] arr; // 배열
static String str = "";
static String[] order; // 순서를 담을 배열
public static void main(String[] args) {
// 행 열 입력받기
System.out.println("공백을 기준으로 행과 열을 입력해주세요.");
Scanner scan = new Scanner(System.in);
strarr = scan.nextLine().split(" ");
x1 = Integer.parseInt(strarr[0]); // 행 할당
y1 = Integer.parseInt(strarr[1]); // 열 할당
arr = new int[x1][y1];
// 배열 입력받기
for(int i=0; i<x1; i++) {
System.out.println(i+1 + "번째 행을 공백을 기준으로 입력해주세요.");
strarr = scan.nextLine().split(" ");
// 검사
if(strarr.length != y1) {
System.out.println("행 값이 맞지 않습니다. 다시 입력해주세요.");
i--;
}else {
for(int j=0; j<y1; j++) {
arr[i][j] = Integer.parseInt(strarr[j]);
}
}
}
// 시간 및 출력 행/열 입력받기
while(check == 0) {
System.out.println("지나갈 시간과 출력할 행과 열을 공백을 기준으로 입력해주세요.");
strarr = scan.nextLine().split(" ");
time = Integer.parseInt(strarr[0]); // 시간 할당
resultx = Integer.parseInt(strarr[1]); // 출력 행 할당
resulty = Integer.parseInt(strarr[2]); // 출력 열 할당
if(resultx*resulty > x1*y1) {
System.out.println("초기 설정한 배열의 수보다 출력하려는 위치가 큽니다. 재입력해주세요.");
}else {
check = 1;
}
}
// 시간에 따라 바이러스 확산
for(int i=0; i<time; i++) {
Sort();
for(int j=0; j<order.length; j++) {
if(j==0) {
Diffusion(Integer.parseInt(order[j]));
}else {
if(!order[j-1].equals(order[j])) {
Diffusion(Integer.parseInt(order[j]));
}
}
}
}
// 출력
System.out.println(arr[resultx-1][resulty-1]);
}
private static void Diffusion(int num) {
String position_x ="", position_y = ""; // 입력 받은 값의 행렬 상 위치 좌표
String[] arr1 = null;
String[] arr2 = null;
for(int i=0; i<x1; i++) {
for(int j=0; j<y1; j++) {
if(arr[i][j] == num) {
if(!"".equals(position_x)) {
position_x += ",";
position_y += ",";
}
position_x += i;
position_y += j;
}
}
}
arr1 = position_x.split(",");
arr2 = position_y.split(",");
for(int i=0; i<arr1.length; i++) {
int x = Integer.parseInt(arr1[i]);
int y = Integer.parseInt(arr2[i]);
// 확산
if(0 < y && y < y1-1) {
if(arr[x][y-1] == 0) {
arr[x][y-1] = num;
}
if(arr[x][y+1] == 0) {
arr[x][y+1] = num;
}
}else if(0 == y){
if(arr[x][y+1] == 0) {
arr[x][y+1] = num;
}
}else if(y1 == y+1) {
if(arr[x][y-1] == 0) {
arr[x][y-1] = num;
}
}
if(0 < x && x < x1-1) {
if(arr[x-1][y] == 0) {
arr[x-1][y] = num;
}
if(arr[x+1][y] == 0) {
arr[x+1][y] = num;
}
}else if(0 == x) {
if(arr[x+1][y] == 0) {
arr[x+1][y] = num;
}
}else if(x1 == x+1) {
if(arr[x-1][y] == 0) {
arr[x-1][y] = num;
}
}
}
}
private static void Sort() {
String change = "";
// 0이 아닌 수만 골라내기
for(int i=0; i<x1; i++) {
for(int j=0; j<y1; j++) {
if(arr[i][j] != 0) {
str += arr[i][j];
if( (i <= x1-1) && (j <= y1-1) ) {
str += ",";
}
}
}
}
order = str.split(","); // 순서 배열에 할당
// 순서 정렬
for(int i=0; i<order.length-1; i++) {
if(Integer.parseInt(order[i]) > Integer.parseInt(order[i+1])) {
change = order[i];
order[i] = order[i+1];
order[i+1] = change;
i--;
}
}
}
}
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 - 1059번 (0) | 2021.03.15 |
---|---|
백준 - 1037번 (0) | 2021.03.15 |
백준 - 1018번 (0) | 2021.03.15 |
백준 - 1010번 (0) | 2021.02.26 |
백준 - 1009번 (0) | 2021.02.26 |