본문 바로가기

코딩 문제/백준

백준 - 18405번

728x90

풀이

( 이클립스로 재코딩하였습니다. )

 

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