ABOUT ME

Today
Yesterday
Total
  • 18405 경쟁적 전염
    백준/그래프 이론 2024. 6. 22. 23:17
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    
    class Position{
    	
    	int x;
    	int y;
    	int virus;
    	
    	Position(int x, int y, int virus) {
    		
    		this.x = x;
    		this.y = y;
    		this.virus = virus;
    	}
    }
    
    public class Main {	
    	
    	static int map[][];	
    	static int N;
    	static int K;	
    	static Queue<Position> q;
    	static int S;
    	
    	
    	public static void main(String[] args) throws IOException {		
    	
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		N = Integer.parseInt(st.nextToken());
    		K = Integer.parseInt(st.nextToken());
    		map = new int [N+1][N+1];
    		q =  new LinkedList<>();
    		List<Position> list = new ArrayList<>();
    		
    		for(int i=1; i<=N; i++) {
    			st = new StringTokenizer(br.readLine(), " ");
    			for(int j= 1; j<=N; j++) {
    				
    				int value = Integer.parseInt(st.nextToken());
    				map[i][j] = value;
    				
    				// 바이러스인 경우
    				if(value != 0) {
    					list.add(new Position(i,j, value));
    				}				
    			}
    		}	
    		
    		// 바이러스 번호가 작을수록 앞으로 위치
            Collections.sort(list, new Comparator<Position>() {
                @Override
                public int compare(Position p1, Position p2) {
                    return p1.virus - p2.virus;
                }
            });
    
    		
            for(int i=0; i<list.size(); i++) {
            	Position p = list.get(i);
            	q.add(new Position(p.x,p.y,p.virus));
            }
    		
    		st = new StringTokenizer(br.readLine(), " ");		
    		S =  Integer.parseInt(st.nextToken());
    		int X =  Integer.parseInt(st.nextToken());
    		int Y =  Integer.parseInt(st.nextToken());
    		
    		bfs();		
    		System.out.println(map[X][Y]);	
    		
    	}
    	
    	
    	
    	public static void bfs() {			
    	
    		int time = 1;		
    		
    		int virusType = q.peek().virus;
    	
    		// time(시간)은 같은 종류의 바이러스가 큐에서 다 나온 뒤 증가하므로
    		// time < S(문제에서 주어진 시간 제한) * K(바이러스 종류 개수) 때까지  
    		while(!q.isEmpty() && time<S*K) {	
    					
    			Position p = q.poll();	
    			
    			
    			// time(시간)은 같은 종류의 바이러스가 큐에서 다 나온 뒤 증가
    			if(p.virus != virusType) {
    				time++;
    				virusType = p.virus;
    			}
    			
    	
    			int dx [] = {-1,1,0,0};
    			int dy [] = {0,0,-1,1};
    	
    	
    				for(int i=0;i<4; i++) {
    					
    					int nx = p.x + dx[i];
    					int ny = p.y + dy[i];		
    					
    					// 바이러스가 이동할 수 있으면
    					if(nx>0 && nx<=N && ny>0 && ny<=N && map[nx][ny]==0) {
    							
    							// 바이러스 이동시킴
    							map[nx][ny] = p.virus;					
    							q.add(new Position(nx, ny, p.virus));
    						
    					}
    				}					
    				
    		}
    		
    	}
    }

    '백준 > 그래프 이론' 카테고리의 다른 글

    1707 이분 그래프  (0) 2024.06.19
    16928 뱀과 사다리 게임  (0) 2024.06.18
    3055 탈출  (0) 2024.06.18
    1068 트리  (0) 2024.06.12
    14502 연구소  (2) 2024.06.10

    댓글

Designed by Tistory.