ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA 4193 - JAVA] 수영대회 결승전
    Algorithm 2020. 11. 9. 18:25
    반응형
     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    삼성이를 우승시키기위한 최단 경로의 시간을 출력하자!

    신호등 문제로 BFS에 현재시간과 소용돌이를 건널 수 있는 시간을 비교해서 큐에 넣어준다.

    소용돌이의 시간이 일정하기 때문에 신호등이나 견우와직녀보다는 비교적 쉬운 문제다.

     

    풀이 방법

    1. 시작점을 큐에 넣어준다.
    2. 큐 사이즈를 받아서 사이즈 만큼 돌아준다 (시간 체크)
    3. 소용돌이를 만날 경우 건널 수 없으면 다시 큐에 넣어준다.
    • 2번을 체크해서 BFS를 구현할 경우 visit배열을 int형으로 해줄 필요가 없다 (메모이제이션 불필요)
    import java.io.*;
    import java.util.*;
    
    public class Solution {
    
    	public static int N, ans;
    	public static int[][] map;
    	public static boolean[][] v;
    	public static int[] S, E;
    	public static int[] dx = {-1, 1, 0, 0};
    	public static int[] dy = {0, 0, -1, 1};
    	
    	public static void main(String[] args) throws Exception {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st;
    		
    		int T = Integer.parseInt(br.readLine());
    		for (int tc = 1; tc <= T; tc++) {
    			N = Integer.parseInt(br.readLine());
    			map = new int[N][N];
    			v = new boolean[N][N];
    			S = new int[2];
    			E = new int[2];
    			for (int i = 0; i < N; i++) {
    				st = new StringTokenizer(br.readLine());
    				for (int j = 0; j < N; j++) {
    					map[i][j] = Integer.parseInt(st.nextToken());
    				}
    			}
    			st = new StringTokenizer(br.readLine());
    			S[0] = Integer.parseInt(st.nextToken());
    			S[1] = Integer.parseInt(st.nextToken());
    			st = new StringTokenizer(br.readLine());
    			E[0] = Integer.parseInt(st.nextToken());
    			E[1] = Integer.parseInt(st.nextToken());
    			if (isAnswer(S[0], S[1])) System.out.println("#"+tc+" "+0);
    			else System.out.println("#"+tc+" "+bfs());
    		}
    	}
    	
    	public static int bfs() {
    		Queue<int[]> que = new LinkedList<int[]>();
    		que.offer(S);
    		v[S[0]][S[1]] = true;
    		
    		
    		int time = 0;
    		while(!que.isEmpty()) {
    			int size = que.size();
    			for (int t = 0; t < size; t++) {
    				int[] cur = que.poll();
    				for (int i = 0; i < 4; i++) {
    					int nx = cur[0] + dx[i];
    					int ny = cur[1] + dy[i];
    					
    					if (!isBoundary(nx, ny) || map[nx][ny] == 1 || v[nx][ny]) continue;
    					if (isAnswer(nx, ny)) 
    						return time+1;
    					if (map[nx][ny] == 2) {
    						if ((time < 2 || (time-2)%3 != 0)) {
    							que.offer(cur.clone());
    							continue;
    						}
    					}
    					que.offer(new int[] {nx, ny});
    					v[nx][ny] = true;
    				}
    			}
    			time++;
    		}
    		return 0;
    	}
    	
    	public static boolean isBoundary(int nx, int ny) {
    		return nx >= 0 && nx < N && ny >= 0 && ny < N;
    	}
    	public static boolean isAnswer(int nx, int ny) {
    		return nx == E[0] && ny == E[1];
    	}
    }
    ​

    'Algorithm' 카테고리의 다른 글

    [백준 3108 - JAVA] 로고  (0) 2020.11.09
    [SWEA 3234 - 준환이의 양팔저울]  (0) 2020.11.09
    [백준 1726 - JAVA] 로봇  (0) 2020.11.09
    [백준 9019 - JAVA] DSLR  (0) 2020.11.09
    [SWEA 4727 - JAVA] 견우와 직녀  (0) 2020.11.09

    댓글