Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 주식 양도세 신고방법
- 톰캣 실시간 로그
- 국세청 해외주식 양도세 신고방식
- java.sql.SQLSyntaxErrorException
- 해외주식 양도세 신고
- Katalon Recorder 사용법
- katalon 자동화
- oracle group by
- tomcat log
- katalon 비교
- CSTS 폭포수 모델
- 피보나치 예제
- katalon
- 최대공약수 예제
- 재귀 예제
- js 자동완성
- bfs 미로탐색 java
- 해외증권 양도세 한국투자증권
- recursion example
- javascript 자동완성
- katalon 사용법
- 테스트 자동화
- 홈택스 해외주식 양도세
- 피보나치함수
- git 연동
- 한국투자증권 해외주식 양도세
- 재귀함수 예제
- 피보나치함수 예제
- 한국투자증권 양도세 신고
- katalon xpath
Archives
- Today
- Total
엄지월드
[백준] 7576 토마토(BFS) 본문
접근 방법
- 전체 배열을 탐색하여 BFS 시작 전에, 1이 포함된 위치를 Queue에 모두 넣어준다.
(ArrayList<int[]> arr = new ArrayList<>();) - BFS 탐색 시, 범위를 벗어나지 않거나, 방문하지 않았거나, 0인 부분을 계속해서 탐색해준다.
특이점
- 기본 BFS는 0(벽)일때 continue를 해주지만, 해당 문제는
num이 여러개 일 수 있기 때문에 다른 num을 침범하지 않기 위해 if(map[nextX][nextY] != 0) continue; 처리해준다. - 이동한 부분에서 max 값을 찾기 위해 계속해서 갱신해준다. max = Math.max(max, map[nextX][nextY]);
package Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOK_7576 {
static int[][] map;
static boolean[][] visited;
static int m;
static int n;
static int cnt;
static int max;
public static void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
map = new int[n][m];
visited = new boolean[n][m];
cnt = 0;
max = 0;
boolean initIsZero = false;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 0) initIsZero = true;
}
}
ArrayList<int[]> arr = new ArrayList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(map[i][j] == 1){
arr.add(new int[]{i,j});
}
}
}
bfs(arr);
boolean isZero = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(map[i][j]+" ");
if(map[i][j] == 0){
isZero = true;
break;
}
}
System.out.println();
if(isZero) break;
}
if(!initIsZero){
System.out.println("0");
return;
}
if(isZero){
System.out.println("-1");
return;
}
System.out.println(max-1);
}
public static void bfs(ArrayList<int []> position){
Queue<int[]> q = new LinkedList<>();
for(int i=0; i<position.size(); i++){
q.add(new int[]{position.get(i)[0],position.get(i)[1]});
}
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
while(!q.isEmpty()){
int now[] = q.poll();
int nowX = now[0];
int nowY = now[1];
for(int i=0; i<4; i++){
int nextX = nowX + dx[i];
int nextY = nowY + dy[i];
if(nextX < 0 || nextY < 0 || nextX >= n || nextY >= m)
continue;
if(map[nowX][nowY] == -1 || map[nextX][nextY] == -1 || visited[nextX][nextY])
continue;
if(map[nextX][nextY] != 0) continue;
q.add(new int[]{nextX, nextY});
map[nextX][nextY] = map[nowX][nowY] + 1;
visited[nextX][nextY] = true;
if(max < map[nextX][nextY])
max = map[nextX][nextY];
}
}
}
public static void main(String[] args) throws IOException {
solution();
}
}
'알고리즘' 카테고리의 다른 글
[백준] 5427 불(BFS) (0) | 2022.08.03 |
---|---|
[백준] 1697 숨바꼭질(BFS) (0) | 2022.08.02 |
[백준] 2606 바이러스(BFS) (0) | 2022.07.27 |
[백준] 2178 미로 탐색 (BFS) (0) | 2022.07.27 |
기술면접 준비 (0) | 2022.07.08 |
Comments