[백준] 17144 미세먼지안녕!

문제보기

삼성 역태 준비중! 제일 쉬워보이는 것부터 차근차근 푸는중

import java.util.*;
import java.io.*;

public class Main{
  static int r;
  static int c;
  static int mac; // machine의 시작 열 

  public static void main(String []args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    r = Integer.parseInt(st.nextToken());
    c = Integer.parseInt(st.nextToken());
    int t = Integer.parseInt(st.nextToken());

    int[][] map = new int[r][c];
    mac = -1;

    for(int i = 0 ; i < r ; i++){
      st = new StringTokenizer(br.readLine());
      for(int j = 0 ; j < c ; j++ ){
        map[i][j] = Integer.parseInt(st.nextToken());
        if(map[i][j] == -1 && mac == -1){
          mac = i;
        }
      }
    }

    while(t-- > 0){
      diff(map); // 확산 결과를 반환하는 함수
      circ(map); // 순환 결과를 반환하는 함수
    }


    int sum = 0;
    for(int i = 0 ; i < r ; i++){
      for( int j = 0 ; j < c ; j++ ){
        sum += map[i][j];
      }
    }
    System.out.println(sum+2); // machine때문에 빠진 2를 보충하여 출력 

  }
 
  // 확산 결과를 반환하는 함수
  static void diff(int[][] map){
		// 확산 된 먼지를 저장할 임시 배열 
    int[][] temp = new int[r][c];

    for(int i = 0 ; i < r ; i++ ){
      for(int j = 0 ; j < c ; j++ ){
        if(!(map[i][j] == 0 || map[i][j] == -1)){
          int cnt = 4;
          int d = map[i][j]/5;
          // 기본적으로 if(이동할수 없는 조건) cnt-- else{ 해당자리temp += d } 라는 내용 
          if( i-1 < 0 || map[i-1][j] == -1 ){ 
            cnt--;
          }else{
            temp[i-1][j] += d;
          }
          if( i+1 >= r || map[i+1][j] == -1){
            cnt--;  
          }else{
            temp[i+1][j] += d;
          }
          if( j-1 < 0 || map[i][j-1] == -1){
            cnt--; 
          }else{
            temp[i][j-1] += d;
          } 
          if( j+1 >= c || map[i][j+1] == -1){
            cnt--;  
          }else{
            temp[i][j+1] += d; 
          } 
          map[i][j] -= d*cnt;

        }
      }
    }
		
    // 모든 확산이 끝났으면 최종적으로 map에 합쳐준다 
    for(int i = 0 ; i < r ; i++ ){
      for(int j = 0 ; j < c ; j++ ){
        map[i][j] += temp[i][j];
      }
    } 
  }
	
  // 순환 결과를 반환하는 함수
  static void circ(int[][] map){
		
    // 일단 윗쪽 반(반시계 방향 순환) 부터 간다. 
    int rr = mac-1;
    int cc = 0;

    while(rr > 0){
      map[rr][cc] = map[--rr][cc];
    }
    rr = 0;
    while( cc < c-1 ){
      map[rr][cc] = map[rr][++cc];
    }
    cc = c-1;
    while( rr < mac ){
      map[rr][cc] = map[++rr][cc];
    }
    rr = mac;
    while( cc > 1 ){
      map[rr][cc] = map[rr][--cc];
    }
    map[rr][1] = 0; // 신선한 공기
		
    // 이제 아랫쪽 시계방향 순환원 처리 
    mac = mac+1;
    rr = mac+1;
    cc = 0;

    while(rr < r-1){
      map[rr][cc] = map[++rr][cc];
    }
    rr = r-1;
    while( cc < c-1 ){
      map[rr][cc] = map[rr][++cc];
    }
    cc = c-1;
    while( rr > mac ){
      map[rr][cc] = map[--rr][cc];
    }
    rr = mac;
    while( cc > 1 ){
      map[rr][cc] = map[rr][--cc];
    }
    map[rr][1] = 0; // 신선한 공기
    mac = mac-1; // 다시 초기화 해줘야 t > 1일때 정상 작동하더라~
  }

}

Tags:

Categories:

Updated:

Comments