๋ฌธ์

์๋ ํ์ธ์! Eric ์ ๋๋ค! ์ค๋ ๊ฐ์ ธ์จ ๋ฌธ์ ๋ bfs๋ก ํ ์ ์๋
๋ฐฑ์ค 7576๋ฒ ํ ๋งํ ๋ฌธ์ ์ ๋๋ค!
๊ทธ๋ฌ๋ฉด ๋ฌธ์ ํ์ด ์์ํด๋ณผ๊น์?
ํ์ด
ํด๋น ๋ฌธ์ ๋ bfs ๋ก ํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค.
์ ๋ ํด๋น ์์น์ ๊ฐ์ class Point ๋ผ๋ ๊ฐ์ผ๋ก ๊ด๋ฆฌ ํ์์ต๋๋ค.
์ฐ์ ํ ๋งํ ๊ฐ ๋ณด๊ด๋๋ ์ฐฝ๊ณ ์์ ์๋ input ๊ฐ๋ค์ ์ ๋ ฅํด์ค๋๋ค.
์ด๋, ์ ๋ ฅ๋๋ ๊ฐ์ด 1 ์ด๋ฉด,
ํด๋น ํ ๋งํ ๋ ์ต์ํ ๋งํ ์ด๋ฏ๋ก ์์ผ๋ก ์์ง์ด๋ฉด์ ๊ทผ์ฒ ํ ๋งํ ๋ค์ ์ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ต์ ํ ๋งํ ๋ค์ด bfs๋ฅผ ๋๋ฉด์ ์,ํ,์ข,์ฐ ์ ํ ๋งํ ๋ค์ ์ต๊ฒ ๋ง๋ค์ด์ค๋๋ค. ([]dx , []dy ์ด์ฉ)
์ด๋ bfs๋ฅผ ๋๋ฉด์
board[][] ์ ์ ๋ ฅ๋ ๊ฐ์ด 1 ์ด๋ฉด,
dis[][] ๋ผ๋ ๋์ผํ ํฌ๊ธฐ์ ๋ฐฐ์ด์์ +1์ฉ ์ถ๊ฐํด์ค๋๋ค.
1์ฉ ์ถ๊ฐํด์ค ์ด์ ๋, Queue๊ฐ ํํด ๋๋๋ง๋ค 1์ผ์ฉ ์ถ๊ฐ ๋๋ฏ๋ก
Queue๊ฐ ๋นํต์ผ ๋ ๋๊น์ง ๋์์ค๋๋ค.
bfs๋ฅผ ๋ค ๋๊ณ ๋์๋
์ต์ง์์ ํ ๋งํ ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด์
๋ค์ for๋ฌธ์ ๋๋๋ค,
๋ง์ฝ board์ ํ๋๋ผ๋ 0 ์ด ์กด์ฌํ๋ฉด,
์ด ํ ๋งํ ํ์ ๋ค ์ต์ง ๋ชปํ๋ ๊ฒ์ด๋ฏ๋ก
๋ง์ง๋ง์ -1์ ์ถ๋ ฅํฉ๋๋ค.
์ฝ๋
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.LinkedList; | |
import java.util.Queue; | |
import java.util.StringTokenizer; | |
class N7576 { | |
static int[] dx = {-1, 0, 1, 0}; | |
static int[] dy = {0, 1, 0, -1}; | |
static int[][] board, dis; | |
static int n, m; | |
static Queue<Point> Q = new LinkedList<>(); // ์ ์ญ์ผ๋ก ์ก์ ์ด์ ๋ BFS ๋ ์ฌ์ฉํด์ผํ์ง๋ง, main ์์๋ ์ต์ ํ ๋งํ ๋ฅผ ๋ฃ์ด์ผํ๊ธฐ๋๋ฌธ | |
public static void bfs() { | |
while (!Q.isEmpty()) { | |
Point tmp = Q.poll(); | |
for (int i = 0; i < 4; i++) { | |
int nx = tmp.x + dx[i]; | |
int ny = tmp.y + dy[i]; | |
if (nx >= 0 && nx < n && ny >= 0 && ny < m && board[nx][ny] == 0) { | |
board[nx][ny] = 1; | |
Q.offer(new Point(nx, ny)); | |
dis[nx][ny] = dis[tmp.x][tmp.y] + 1; | |
} | |
} | |
} | |
} | |
public static void main(String[] args) 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()); | |
board = new int[n][m]; | |
dis = new int[n][m]; | |
for (int i = 0; i < n; i++) { | |
st = new StringTokenizer(br.readLine()); | |
for (int j = 0; j < m; j++) { | |
board[i][j] = Integer.parseInt(st.nextToken()); | |
if (board[i][j] == 1) Q.offer(new Point(i, j)); // ์ต์ ํ ๋งํ ๋ฃ์ด๋๊ธฐ - 0 ๋ ๋ฒจ | |
} | |
} | |
// bfs ๋๊ธฐ | |
bfs(); | |
boolean flag = true; // ์ต์ง ์์ ํ ๋งํ ๊ฒ์์ฉ | |
int answer = Integer.MIN_VALUE; | |
//board ๋ฅผ ๋๋ฉด์ ๊ฐ์ด 0์ธ ๊ฐ์ด ์์ผ๋ฉด flag ๋ฅผ false ๋ก ๋ง๋ค์ด์ค๋ค. | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < m; j++) { | |
if (board[i][j] == 0) flag = false; | |
} | |
} | |
// flag ๊ฐ์ด true ์ธ ๊ฒฝ์ฐ์๋ง max ๊ฐ์ ๋์ถํ๋๋ก for๋ฌธ์ ๋๋ค. | |
if (flag) { | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < m; j++) { | |
answer = Math.max(answer, dis[i][j]); | |
} | |
} | |
System.out.println(answer); | |
} else System.out.println(-1); | |
br.close(); | |
} | |
} | |
class Point { | |
public int x, y; | |
Point(int x, int y) { | |
this.x = x; | |
this.y = y; | |
} | |
} |

'๐ป ๊ฐ๋ฐ๊ณต๋ถ > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Eric's ๋ฐฑ์ค] 1012๋ฒ - ์ ๊ธฐ๋๋ฐฐ์ถ ๐ฅฌ - Java (0) | 2023.02.24 |
---|---|
[Eric's ๋ฐฑ์ค] 7569๋ฒ - ํ ๋งํ - Java ๐ ๐ (2) | 2023.02.17 |
[Eric's ๋ฐฑ์ค] 9020๋ฒ - ๊ณจ๋๋ฐํ์ ์ถ์ธก - Java (0) | 2023.02.16 |
[Eric's ๋ฐฑ์ค] 6588๋ฒ - ๊ณจ๋๋ฐํ์ ์ถ์ธก - Java (0) | 2023.02.16 |
[Eric's ๋ฐฑ์ค] 1747๋ฒ - ์์&ํฐ๋ฆฐ๋๋กฌ - Java (0) | 2023.02.16 |