[BOJ]벽 부수고 이동하기 3.java

전영서·2021년 9월 24일
0

Algorithm

목록 보기
58/89

1.문제

2.코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main{
	static int C,R;
	
	public static class Person{
		int y,x,k;
		
		Person(int y,int x, int k){
			this.y = y;
			this.x = x;
			this.k = k;
		}
	}
	
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        boolean day = true;
        
        int[][] board = new int[H][W];
        boolean[][][] visited = new boolean[K+1][H][W];
        
        for(int i=0; i<H; i++) {
        	String str = br.readLine();
        	for(int j=0; j<W; j++) {
        		board[i][j] = str.charAt(j)-'0';
        	}
        }
        
        Queue<Person> queue = new LinkedList<Person>();
        
        queue.add(new Person(0,0,0));
        //움직임
        int[] move_y = {-1,1,0,0};
        int[] move_x = {0,0,1,-1};
        
        int count = 1;
        while(!queue.isEmpty()) {
        	int num = queue.size();
        	
        	while(num != 0) {
        		Person person = queue.poll();
        		int y = person.y;
        		int x = person.x;
        		int k = person.k;
        		
        		if(y==H-1 && x==W-1) {
        			System.out.println(count);
        			return;
        		}
        		
        		for(int i=0; i<4; i++) {
        			int new_y = y+move_y[i];
        			int new_x = x+move_x[i];
        			if(new_y>=0 && new_y<H && new_x>=0 && new_x<W && !visited[k][new_y][new_x] && board[new_y][new_x]==0) {
        				queue.add(new Person(new_y, new_x, k));
        				visited[k][new_y][new_x] = true;
        			}
        		}
        		
        		if(k!=K) {
        			k++;
	        		for(int i=0; i<4; i++) {
	        			int new_y = y+move_y[i];
	        			int new_x = x+move_x[i];
	        			if(new_y>=0 && new_y<H && new_x>=0 && new_x<W && board[new_y][new_x]==1 && !visited[k][new_y][new_x] && day) {
	        				queue.add(new Person(new_y, new_x, k));
	        				visited[k][new_y][new_x] = true;
	        				visited[k][y][x] = true;
	        				
	        			}
	        		}
        		}
            //밤에만 대기
        		if(!day) {
        			queue.add(person);
        		}
        		num --;
        	}
          //밤낮 
        	day = !day;
        	count ++;
        }
        
        System.out.println(-1);
        bw.flush();
        bw.close();
        br.close();
    }
    
}

3.Reveiw

이 문제 역시 벽 부수고 이동하기 2와 비슷하다.

다만 고려사항이 더 추가되었다 .

제자리에서 대기할수 있다는 것과 낮에만 벽을 부술수 있다는 것.

이때 불필요한 움직임을 없애주어야지만 시간초과가 나지 않는다

따라서 벽을 부술수 없는 낮에만 제자리에서 대기를 하고 벽을 부술때 낮인지 확인하는

코드만 추가해주었다.

profile
꾸준히 성실하게

0개의 댓글