작년에는 못풀었던문제 ㅎㅎ 

https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

정답:

package test01;
import java.util.*;

public class Main {
    private int x;
    private int y;
    private int data;
    public Main(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public Main(int x, int y, int data) {
        this.x = x;
        this.y = y;
        this.data = data;
    }

    public int I() {
        return this.x;
    }

    public int J() {
        return this.y;
    }

    public int Data() {
        return this.data;
    }

    public static void Prints(int tmaps[][],int n, int m) {
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<m;j++) {
    			System.out.print(tmaps[i][j]+",");
    		}
    		System.out.println();
    	}
    	 System.out.println();
    }
    public static int Sums(int tmaps[][],int n, int m) {
    	int totalsum=0;
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<m;j++) {
    			if(tmaps[i][j]!=-1) {
    				totalsum=totalsum+tmaps[i][j];
    			}
    			
    		}
    	}
    	return totalsum;
    }
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
       
        //미세먼지를 제거하기 위해 구사과 공기청정기를 설치하려한다
        //공기 청정기의 성능은 테스트하기 위해 구사과는 집을 크기가 RXC인 격자판으로 나타냈고 ,
        //구사과는 뛰어난 코딩 실력을 이용하여 RC 에 있는 미세먼지양을 실시간으로 모니터링하는 시스템을 개발햇다.
        
        //공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두행을 차지한다.
        // 공기청정기가 설치되어 있지않는 칸에는 미세먼지가 잇고, RC 미세먼지의 양은 Arc이다
        
        //1초 동안 아래 적힌 일이 순서대로 일어난다.
        
        //1.미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다
        //r,c에 있는 미세먼지는 인접한 네 방향으로 확산된다.
        //r,c 에 있는 공기청정기 잇거나, 칸이 없으면 그방향 확산되지않난다,
        //확산되는 양은 a/5이고 소수점은 버린다
        //rc에 남는 미세먼지양은 a-a/5*확산된 방향의 갯수이다
        // 2. 공기 청저기가 작동한다
        // 공기청정기에서는 바람이 나온다.
         //위쪽 공기 청정기의 바람은 반시계방향으로 순환하고, 아래쪽 공기청정기의 바람
         int n=scan.nextInt();
         int m=scan.nextInt();
         int T= scan.nextInt();
         int maps[][]=new int[n][m];
         int blankmaps[][]=new int[n][m];
         int copymaps[][]=new int[n][m];
         
         int init[][]=new int[n][m];
         ArrayList<Main>air=new ArrayList<>();
         
         for(int i=0;i<n;i++) {
        	 for(int j=0;j<m;j++) {
        		 int tmp =scan.nextInt();
        		 maps[i][j]=tmp;
        		 
        		 if(tmp ==-1) {
        			 blankmaps[i][j]=-1;
        			 copymaps[i][j]=-1;
        			
        			 air.add(new Main(i,j));
        		 }
        	 }
         }
         
         int []diri= {1,-1,0,0};
         int []dirj= {0,0,1,-1};
         
         for(int z=0;z<T;z++) {
        	 //Prints(maps,n,m);
        	 for(int i=0;i<n;i++) {
            	 for(int j=0;j<m;j++) {
            		 //먼지 확산
            		
            		 if(maps[i][j]!=-1&&maps[i][j]!=0) {
            			 int cnt=0;
            			 ArrayList<Main>d=new ArrayList<>();
            			 for(int k=0;k<4;k++) {
            				 int tmpdiri=i+diri[k];
            				 int tmpdirj=j+dirj[k];
            				 
            				 if(tmpdiri==-1||tmpdirj==-1||tmpdiri>=n||tmpdirj>=m) {
                				 continue;
                			 }
            				 if(maps[tmpdiri][tmpdirj]==-1) {
            					 continue;
            				 }
            				 cnt++;
            				 d.add(new Main(tmpdiri,tmpdirj));
            				 //좌표값저장
            			 }
            			 
            			 //상하좌우
            			 for(int k=0;k<d.size(); k++ ) {
            				 Main pos=d.get(k);
            				 blankmaps[pos.I()][pos.J()]=blankmaps[pos.I()][pos.J()] +  maps[i][j]/5 ;
            				
            			 }
            			 blankmaps[i][j]= blankmaps[i][j] + maps[i][j] - maps[i][j]/5 * cnt; //9-2

            		 }
            		 
            	 }
             }
 
        	 for(int i=0;i<n;i++) {
            	 for(int j=0;j<m;j++) {
            		 maps[i][j]=blankmaps[i][j];
            	 }
            	 
        	 }
        	//공기청정기 작동
        	// 위쪽 공기청정기 작동
        	 int x=0;
        	 int y=0;
        	 Main up = air.get(0);
        	 x = up.I();
        	 y = up.J();

        	 // 반시계 방향으로 이동
        	 // 아래로 이동
        	 for (int i = x-1; i > 0; i--) maps[i][0] = maps[i-1][0];
        	 
        	// 왼쪽으로 이동
        	 for (int i = 0; i < m - 1; i++) maps[0][i] = maps[0][i + 1];
        	 
        	// 위쪽으로 이동
        	 for (int i = 0; i <= x-1; i++) maps[i][m - 1] = maps[i+1][m - 1];
        	 
        	 // 오른쪽으로 이동
        	 for (int i =  m-1; i >0; i--) maps[x][i] = maps[x][i-1];
        
        	 // 공기청정기 위치의 먼지 제거
        	 maps[x][y] = -1;
        	 maps[x][y+1] = 0;
        	 
        	 
        	 // 공기청정기 작동 (하단)
        	 Main down = air.get(1);
        	 x = down.I();
        	 y = down.J();

        	 // 시계 방향으로 이동
        	 // 위쪽으로 이동
        	 for (int i = x; i < n-1; i++) maps[i][y] = maps[i+1][y];
        	// Prints(maps, n, m);
        	 // 왼쪽이동
        	 for (int i = 0; i < m-1; i++) maps[n-1][i] = maps[n-1][i+1];
        	// Prints(maps, n, m);
        	 // 아래쪽이동
        	 for (int i = n-1; i > x; i--) maps[i][m-1] = maps[i-1][m-1];
        	 //Prints(maps, n, m);
        	 // 오른쪽이동
        	 for (int i = m-1; i > 0; i--) maps[x][i] = maps[x][i-1];
        	// Prints(maps, n, m);

        	 // 공기청정기 위치의 먼지 제거
        	 maps[x][y] = -1;
        	 maps[x][y+1] = 0;

        	 for(int i=0;i<n;i++) {
            	 for(int j=0;j<m;j++) {
            		 blankmaps[i][j]=copymaps[i][j];
            	 }
            	 
        	 }
         }
         int tsum=Sums(maps, n, m);
         System.out.print(tsum);
         
    }
}

'알고리즘 공부' 카테고리의 다른 글

백준 톱니바퀴  (0) 2024.01.17
백준 숨바꼭질4  (0) 2024.01.12
백준 - 경쟁적 전염  (1) 2024.01.02
백준 치즈 2638  (1) 2023.12.19
백준 스도쿠  (0) 2023.12.18

+ Recent posts