ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준][자바][17144] 미세먼지 안녕!
    코딩/알고리즘 2019. 4. 21. 22:48

    아 머리아프다...

    이 문제는 알고보면 

    풀란대로 풀면 끝나는 아주 간단한 문제인데.

    선행학습이 안되어있으면 좀 삽질을 거듭할수 있다.

    중점적으로 볼사항은 

    일단 퍼트릴떄 초기 맵을 건드리면 안되는 문제와 ( 그래서 COPYMAP 을 사용함)

    공기 청정기 위 아래의 바람에 따라서 먼지의 이동만 잘 구현 해놓으면 풀리는 문제이다

     

    큐를 써서 하려고 했는데 위와 같은 문제에 봉착해서 다른 분들 코드를 참고해서 포문 2개로 풀었는데

    꼭큐를 쓸꺼야 하는 그런 강박관념은 없어도 될것같다. 

    아 그리고 보니...안쓰는 코드 정리를 안했네....

    곧 카페가 문을 닫아서 나중에 수정해야겠다.ㅠㅠ

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    class Dust{
    	int y;
    	int x;
    	int value;
    	Dust(int y, int x, int value){
    		this.y = y;
    		this.x = x;
    		this.value = value;
    	}
    }
    class AirCleaner{
    	int y;
    	int x;
    	int position;
    	AirCleaner(int y, int x, int position ){
    		this.y = y;
    		this.x = x;
    		this.position = position;
    	}
    	
    }
    public class Main_Backjoon_17144_미세먼지안녕 {
    	static int R;
    	static int C;
    	static int T;
    	static int[] dx = {1, -1, 0, 0};
    	static int[] dy = {0, 0, 1, -1};
    	static int[][] MAP = new int[1001][1001];
    	static int[][] TEMPMAP = new int[1001][1001];
    	static Queue q = new LinkedList();
    	static ArrayList air = new ArrayList();
    
    	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());
    		T = Integer.parseInt(st.nextToken());
    		// r, c, s, d, z
    		for(int i = 0 ; i < R; i++ ) {
    			st = new StringTokenizer(br.readLine() , " ");
    			int idx = 0 ;
    			int flag = 0; // 0은 up, 1down
    			while(st.hasMoreTokens()){
    				MAP[i][idx] = Integer.parseInt(st.nextToken());
    //				if(MAP[i][idx] != 0 && MAP[i][idx] != -1) {
    //					q.add(new Dust(i, idx, MAP[i][idx])); 
    //				}else if(MAP[i][idx] == -1 ) {
    //					air.add(new AirCleaner(i, idx, flag));
    //					flag = 1;
    //				}
    				
    				if(MAP[i][idx] == -1 ) {
    					air.add(new AirCleaner(i, idx, flag));
    					flag = 1;
    				}
    				idx += 1;
    			}
    		}
    		
    //		printMap();
    //		System.out.println();
    //		spreadNew();
    //		System.out.println();
    //		printMap();
    		for(int i = 0 ; i < T ; i++) {
    			spreadNew();
    			airCircult();
    			//printMap();
    			//System.out.println();
    		}
    		count();
    	}
    	public static void count() {
    		int SUM = 0;
    		for(int i = 0; i < R; i++) {
    			for(int j =0; j < C; j++) {
    				if(MAP[i][j] != -1) {
    					SUM += MAP[i][j];
    				}
    			}
    		}
    		System.out.println(SUM);
    	}
    	
    	public static void copyMap(int[][] COPYMAP, int[][] MAP) {
    		for(int i = 0; i < R; i++) {
    			for(int j =0; j < C; j++) {
    				COPYMAP[i][j] = MAP[i][j];
    			}
    		}
    	}
    	//q에 넣고 
    	public static void spreadNew() {
    		int[][] COPYMAP = new int[R][C];
    		copyMap(COPYMAP, MAP);
    		
    		for(int i = 0; i < R; i++) {
    			for(int j = 0; j < C; j++) {
    				if( MAP[i][j] != -1 && MAP[i][j] != 0) {
    					int value = MAP[i][j];			
    					int spread = value / 5; //기존 MAP 에서 
    					int count = 0 ;
    					for(int d = 0; d < 4; d++) {
    						int xx = dx[d] + j;
    						int yy = dy[d] + i;
    						if(xx >= 0 && xx < C && yy >= 0 && yy < R) {
    							if( MAP[yy][xx] != -1) {
    								COPYMAP[yy][xx] += spread;
    								count += 1;
    							}
    						}
    					}
    					//Ar,c - (Ar,c/5)×(확산된 방향의 개수)
    					//이미 확산되서 더해진 것도 생각해야함 
    					COPYMAP[i][j] = COPYMAP[i][j] - ( value / 5 ) * count;
    				}
    			}
    		}
    		copyMap(MAP, COPYMAP);
    	}
    
    
    	public static void airCircult() {
    		for(int idx = 0 ; idx< 2; idx++) {
    			AirCleaner cleaner = air.get(idx);
    
    			if( idx == 0 ) {
    				int ay = cleaner.y;
    				int ax = cleaner.x;
    				//아래로 땡기기
    				for(int y = ay-1; y > 0; y--) {
    		
    					MAP[y][ax] = MAP[y-1][ax];
    					//arrList.add(new Dust( y, ax, MAP[y][ax])); 
    				}		
    				//오른쪽  
    				for(int x = 0; x < C -1 ; x++) {
    					MAP[0][x] = MAP[0][x + 1];
    					//arrList.add(new Dust( ay, x, MAP[ay][x])); 
    				}
    				
    				//밑으로 
    				for(int y = 0; y < ay; y++) {
    					MAP[y][C-1] = MAP[y+1][C-1];
    					//arrList.add(new Dust( y, ax, MAP[y][ax])); 
    				}	
    				//왼쪽 
    				for(int x = C-1; x > ax +1 ; x--) {
    					MAP[ay][x] = MAP[ay][x - 1];
    					//arrList.add(new Dust( ay, x, MAP[ay][x])); 
    				}
    				MAP[ay][ax+ 1] = 0; 
    			}
    		
    			if( idx == 1 ) {
    				int ay = cleaner.y;
    				int ax = cleaner.x;
    				//아래로 땡기기
    				for(int y = ay+1; y < R; y++) {
    					MAP[y][ax] = MAP[y+1][ax];
    					//arrList.add(new Dust( y, ax, MAP[y][ax])); 
    				}		
    				//오른쪽  
    				for(int x = 0; x < C -1 ; x++) {
    					MAP[R-1][x] = MAP[R-1][x + 1];
    					//arrList.add(new Dust( ay, x, MAP[ay][x])); 
    				}
    				
    				//위
    				for(int y = R -1 ; y > ay -1; y--) {
    					MAP[y][C-1] = MAP[y-1][C-1];
    					//arrList.add(new Dust( y, ax, MAP[y][ax])); 
    				}	
    				//왼쪽 
    				for(int x = C-1; x > ax +1 ; x--) {
    					MAP[ay][x] = MAP[ay][x - 1];
    					//arrList.add(new Dust( ay, x, MAP[ay][x])); 
    				}
    				MAP[ay][ax+ 1] = 0; 
    			}
    			}
    	
    	}
    	
    	
    	
    	
    	public static void printMap() {
    		for(int i = 0 ; i < R ; i++) {
    			for(int j = 0 ; j < C ; j++) {
    				System.out.print(MAP[i][j] + " ");
    			}
    			System.out.println();
    		}
    	}
    }
    
    

    댓글

Designed by Tistory.