[백준] 7576: 토마토 - Java (그래프)
Algorithm/BackJun 2024. 1. 23.
반응형
목 차
- 문제
- 접근 방식
- 풀이
문제
접근 방식
비교적 친근한 BFS를 통해 접근하려고 한다.
BFS를 떠올리면 상하좌우 노드를 모두 넣고 마지막으로 빼내어 지는 노드의 날짜를 출력하면 된다.
Queue
- 상하좌우 범위 내에 있고, 해당 노드가 0(방문하지 않음)이면 Queue에 등록
- 등록 후 그래프에 해당 좌표 노드를 1(방문함)로 변경
예외처리
- 배열에 0이 남아있다면 모두 익지 못하는 상황이니 -1 출력
풀이
package src.Graph;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class 토마토_7576 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// M: 가로칸 수, N: 세로칸 수
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
// 그래프 배열
int[][] graph = new int[N][M];
// BFS
Queue<int[]> queue = new LinkedList<>();
// 그래프: 입력
for(int i = 0; i < N; i++){
StringTokenizer nodes = new StringTokenizer(br.readLine());
for(int j = 0; j < M; j++){
graph[i][j] = Integer.parseInt(nodes.nextToken());
if(graph[i][j] == 1){
int[] node = {j, i, 0};
queue.add(node);
}
}
}
int day = 0;
// Solution
while(!queue.isEmpty()){
// queue POP()
int[] node = queue.remove();
int x = node[0];
int y = node[1];
int d = node[2];
day = Math.max(day, d);
// queue 등록
// 상
if(y - 1 >= 0){
if(graph[y - 1][x] == 0){
graph[y - 1][x] = 1;
int[] next = {x, y - 1, d + 1};
queue.add(next);
}
}
// 하
if(y + 1 < graph.length){
if(graph[y + 1][x] == 0){
graph[y + 1][x] = 1;
int[] next = {x, y + 1, d + 1};
queue.add(next);
}
}
// 좌
if(x - 1 >= 0){
if(graph[y][x-1] == 0){
graph[y][x - 1] = 1;
int[] next = {x - 1, y, d + 1};
queue.add(next);
}
}
// 우
if(x + 1 < graph[y].length){
if(graph[y][x + 1] == 0){
graph[y][x + 1] = 1;
int[] next = {x + 1, y, d + 1};
queue.add(next);
}
}
}
// true: 정상, false: 비정상
boolean result = true;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(graph[i][j] == 0){
result = false;
break;
}
}
}
if(result){
System.out.println(day);
} else {
System.out.println(-1);
}
}
}
반응형
'Algorithm > BackJun' 카테고리의 다른 글
[백준] 10282: 해킹 - Java (Dijkstra) (0) | 2024.03.29 |
---|---|
[백준] 2109: 순회강연 - Java (우선순위 큐) (0) | 2024.02.15 |
[백준] 11722: 가장 긴 감소하는 부분 수열 - Java (DP) (0) | 2024.01.22 |
[백준] 9465: 스티커 - Java (DP) (0) | 2024.01.21 |
[백준] 1003: 피보나치 함수 - Java (DP) (0) | 2024.01.16 |