알고리즘/백준

21736_헌내기는 친구가 필요해

베리영young 2023. 12. 19. 15:40

사용 알고리즘: bfs

사용 언어: java

 

 

 

 

 

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_bj_21736_헌내기친구 {

    static int n, m, res;
    static int Ix, Iy;
    static char[][] map;
    static int[] dx = {1,-1,0,0};
    static int[] dy = {0,0,1,-1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        map = new char[n][m];

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            for (int j = 0; j < m; j++) {
                map[i][j] = s.charAt(j);

                if(map[i][j]=='I'){
                    Ix = i;
                    Iy = j;
                }
            }
        } //입력

        bfs(Ix, Iy);

        if(res!=0){
            System.out.println(res);
        } else {
            System.out.println("TT");
        }
    }

    private static void bfs(int x, int y) {
        Queue<Point> q = new ArrayDeque<>();
        q.offer(new Point(x, y));
        while (!q.isEmpty()) {
            Point p = q.poll();
            for (int d = 0; d < 4; d++) {
                int nx = p.x+dx[d];
                int ny = p.y+dy[d];

                if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
                if(map[nx][ny]=='X' || map[nx][ny]=='I') continue;
                if(map[nx][ny]=='P') res++;

                q.offer(new Point(nx, ny));
                map[nx][ny] = 'I'; //방문 처리
            }
        }
    }
}

 

 

알고리즘 선택 이유:

x를 기준으로 구역 나누기 기법을 써야 하기 때문에 bfs가 가장 적합하다고 판단

 

이슈

무한 루프 -> 방문처리를 위해 map[nx][ny]='I'를 넣었음에도 불구하고...

 

해결:

If조건에서 map[nx][ny]=='I'를 안 넣음 => 방문 처리를 그냥 'X'로 했으면 됐지만, 도연이가 움직였다는 걸 표시하고 싶어서 I를 넣음

 

느낀점:

방문 처리 뿐 아니라, 방문된 곳의 영역을 가지 않는 조건도 잘 넣어주기!