https://www.acmicpc.net/problem/10709
코드설명
너비우선탐색(BFS)를 활용합니다.
- BFS 시작 전에 모든 위치를 -1로 초기화한다.
- BFS를 수행하면서 Node의 time 값을 갱신한다.
- 만약 BFS가 모두 수행되면 중단한다.
- BFS가 중단되는 조건은 col 값이 W와 같거나 커지면 더 이상 큐에 삽입하지 않는다.
구름은 동쪽방향으로만 움직이므로, 만약 이미 구름이 있던 흔적이 있다면 Queue에 넣지 않아서 연산시간을 줄일 수 있습니다.
코드
package algorhythm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; //1. BFS 시작 전에 모든 위치는 0 -1로 두고 시작한다. //2. BFS 를 돌며 Node의 time값으로 갱신한다. //3. 만약, BFS 가 모두 사용되면 중단된다. //4. BFS가 중단되는 조건은 col, 문제에서는 W보다 col값이 같거나 커지면 더 이상 큐에 삽입하지 않는다. public class Main { public static int N, H, W; public static int answer = 0; public static char[][] map; public static int[][] visited; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); H = Integer.parseInt(st.nextToken()); W = Integer.parseInt(st.nextToken()); map = new char[H][W]; visited = new int[H][W]; for(int i=0;i<H;i++) { for(int j=0;j<W;j++) { visited[i][j] = -1; // System.out.print(" "+visited[i][j]); } // System.out.println(); } // System.out.println(); for(int i=0;i<H;i++) { st = new StringTokenizer(br.readLine()); String str = st.nextToken(); for(int j=0;j<W;j++) { map[i][j] = str.charAt(j); // System.out.print(" "+map[i][j]); } // System.out.println(); } // System.out.println(); BFS(); for(int i=0;i<H;i++) { for(int j=0;j<W;j++) { System.out.print(visited[i][j]+" "); } System.out.println(); } } public static void BFS() { int[] dx = {0}; int[] dy = {1}; Queue<Node> q = new LinkedList<>(); for(int i=0;i<H;i++) { for(int j=0;j<W;j++) { if(map[i][j] == 'c') { q.offer(new Node(i, j, 0)); visited[i][j] = 0; } } } while(!q.isEmpty()) { Node temp = q.poll(); for(int dir = 0; dir < 1; dir++) { int nr = temp.r + dx[dir]; int nc = temp.c + dy[dir]; int ntime = temp.time + 1; if(nr >= H || nr < 0 || nc >= W || nc < 0) continue; //범위 넘어간다면, if(visited[nr][nc] != -1) continue; //이미 지나간곳임. visited[nr][nc] = ntime; q.offer(new Node(nr, nc, ntime)); } } } } class Node{ int r; int c; int time; public Node(int r, int c, int time) { this.r = r; this.c = c; this.time = time; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 11050 이항 계수 1 - 재귀함수(Recursive Function) JAVA (0) | 2024.07.02 |
---|---|
[백준] 14939 불 끄기 - 비트마스킹(BitMasking) + 그리디(Greedy) + 순서강제하기 JAVA (0) | 2024.05.14 |
[백준] 2775 부녀회장이 될테야 - DP(Dynamic Programming) JAVA (0) | 2024.04.04 |
[백준] 17779 게리맨더링2 - 시뮬레이션(Simulation) + 브루트포스(brute force) JAVA (0) | 2024.01.17 |
[백준] 15683 감시 - Brute Force(완전탐색) + 구현(Implementation) + Simulation(시뮬레이션) JAVA (0) | 2024.01.07 |