๋ฌธ์
๋ฌธ์ ๋งํฌ https://www.acmicpc.net/problem/21736
- ๋์ฐ์ด๊ฐ ๋ค๋๋ ๋ํ์ ์บ ํผ์ค๋ N×Mํฌ๊ธฐ์ด๋ฉฐ ์บ ํผ์ค์์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ฒฝ์ด ์๋ ์ํ์ข์ฐ๋ก ์ด๋ํ๋ ๊ฒ์ด๋ค.
- ์๋ฅผ ๋ค์ด, ๋์ฐ์ด๊ฐ (x, y)์ ์๋ค๋ฉด ์ด๋ํ ์ ์๋ ๊ณณ์ (x+1, y), (x, y+1), (x−1, y), (x, y−1)์ด๋ค.
- ๋จ, ์บ ํผ์ค์ ๋ฐ์ผ๋ก ์ด๋ํ ์๋ ์๋ค.
- ๋ถ์ํ ๋์ฐ์ด๋ฅผ ์ํ์ฌ ์บ ํผ์ค์์ ๋์ฐ์ด๊ฐ ๋ง๋ ์ ์๋ ์ฌ๋์ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์.
- ์ฒซ์งธ ์ค์๋ ์บ ํผ์ค์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N(1 ≤ N ≤ 600), M(1 ≤ M ≤ 600)์ด ์ฃผ์ด์ง๋ค.
- ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์บ ํผ์ค์ ์ ๋ณด๋ค์ด ์ฃผ์ด์ง๋ค.
- O๋ ๋น ๊ณต๊ฐ, X๋ ๋ฒฝ, I๋ ๋์ฐ์ด, P๋ ์ฌ๋์ด๋ค. I๊ฐ ํ ๋ฒ๋ง ์ฃผ์ด์ง์ด ๋ณด์ฅ๋๋ค.
- ์ฒซ์งธ ์ค์ ๋์ฐ์ด๊ฐ ๋ง๋ ์ ์๋ ์ฌ๋์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋จ, ์๋ฌด๋ ๋ง๋์ง ๋ชปํ ๊ฒฝ์ฐ TT๋ฅผ ์ถ๋ ฅํ๋ค.
์์ด๋์ด
- I์ ์ขํ๊ฐ์ ๊ธฐ์ค์ผ๋ก BFS๋ฅผ ๋๋ฆฌ๋ฉด์ ์ํ์ข์ฐ ์ขํ๋ฅผ ํ์ํ๊ณ O์ผ ๊ฒฝ์ฐ, Queue์ ์ขํ๊ฐ์ ๋ฃ์ด์ ๊ณ์ ํ์ํ๋ค.
- ์ขํ๊ฐ์ด P์ผ ๊ฒฝ์ฐ, ์ฌ๋ ์๋ฅผ ์นด์ดํธ ํด์ฃผ๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก Queue์ ์ขํ๊ฐ์ ๋ฃ์ด ๊ณ์ ํ์ํ๋ค.
๊ฒช์ ์ํ์ฐฉ์ค
- X
์ฝ๋
import java.awt.*;
import java.io.*;
import java.util.*;
public class BOJ21736 {
static int N;
static int M;
static char campus[][];
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
static boolean visited[][];
static int cnt;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// ํ
N = Integer.parseInt(st.nextToken());
// ์ด
M = Integer.parseInt(st.nextToken());
// ์บ ํผ์ค๋ฅผ ์ ์ฅํ 2์ฐจ์ ๋ฐฐ์ด
campus = new char[N][M];
// ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited = new boolean[N][M];
// ๋ง๋ ์ฌ๋์ ์
cnt = 0;
// ๋์ฐ์ ์ขํ๋ฅผ ์ ์ฅํ ๋ณ์
int d_x = 0;
int d_y = 0;
for(int i = 0; i < N; i++){
String s = br.readLine();
for(int j = 0; j < M; j++){
char c = s.charAt(j);
// c๊ฐ I์ผ ๊ฒฝ์ฐ, ๊ทธ ์ขํ๊ฐ ๋์ฐ์ ์ขํ์ด๋ฏ๋ก
// ๋์ฐ์ ์ขํ๋ฅผ ๋ณ์์ ์ ์ฅ
if(c == 'I'){
d_x = i;
d_y = j;
}
// ์บ ํผ์ค์ ์ ๋ณด๋ฅผ ์ ์ฅ
campus[i][j] = c;
}
}
// ๋์ฐ์ด์ ์ขํ๋ฃ BFS๋ฅผ ๋๋ฆผ
BFS(d_x, d_y);
if(cnt == 0){
System.out.println("TT");
}
else{
System.out.println(cnt);
}
}
public static void BFS(int x, int y){
Queue<Point> q = new LinkedList<>();
// ๋์ฐ์ด๊ฐ ์๋ ์ขํ๋ฅผ Queue์ ๋ฃ์ด์ค
q.offer(new Point(x, y));
// ํด๋น ์ขํ๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[x][y] = true;
// Queue๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
while(!q.isEmpty()){
// ์ขํ๊ฐ์ ๋ณ์์ ์ ์ฅ
int node_x = q.peek().x;
int node_y = q.peek().y;
q.poll();
for(int i = 0; i < 4; i++){
// ์ํ์ข์ฐ์ ์ขํ๊ฐ์ ์ ์ฅ
int nx = node_x + dx[i];
int ny = node_y + dy[i];
// ๋ง์ฝ ํด๋น ์ขํ๊ฐ์ด ๋ฐฐ์ด๋ฒ์๋ฅผ ๋์ด๊ฐ๋ค๋ฉด continue
if(nx >= N || nx < 0 || ny >= M || ny < 0){
continue;
}
// ๋ฒ์์์ ๋ค๊ณ ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
if(!visited[nx][ny]){
// ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ
visited[nx][ny] = true;
// ๋ง์ฝ ํด๋น ๋ฐฐ์ด๊ฐ์ด P๋ผ๋ฉด ์ฌ๋์ด ์๋ค๋ ๋ป์ด๋ฏ๋ก
if(campus[nx][ny] == 'P'){
// ์ฌ๋ ์ + 1 ํ๊ณ
cnt = cnt + 1;
// Queue์ ํด๋น ์ขํ๊ฐ์ ๋ฃ์
q.offer(new Point(nx, ny));
}
// ๋ฐฐ์ด๊ฐ์ด O๋ผ๋ฉด ๋น ๊ณต๊ฐ์ด๋ฏ๋ก
else if(campus[nx][ny] == 'O'){
// Queue์ ํด๋น ์ขํ๊ฐ์ ๋ฃ์
q.offer(new Point(nx, ny));
}
}
}
}
}
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] BOJ 1074 Z (0) | 2024.08.18 |
---|---|
[Java] BOJ 30804 ๊ณผ์ผ ํํ๋ฃจ (2) | 2024.08.17 |
[Java] BOJ 18870 ์ขํ ์์ถ (2) | 2024.08.15 |
[Java] BOJ 18111 ๋ง์ธํฌ๋ํํธ (0) | 2024.08.14 |
[Java] BOJ 11724 ์ฐ๊ฒฐ ์์์ ๊ฐ์ (0) | 2024.08.13 |