mun dev

[백준] 21736 헌내기는 친구가 필요해 자바(Java) 본문

알고리즘/백준

[백준] 21736 헌내기는 친구가 필요해 자바(Java)

mndev 2023. 11. 6. 15:42

문제설명

2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.

도연이가 다니는 대학의 캠퍼스는 NxM크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 (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를 출력한다.

 

풀이

도연이의 위치에서 만날 수 있는 사람의 위치를 출력하기 때문에 DFS를 사용해서 풀이했다. 방문하지 않았고 X가 아니라면 상, 하, 좌, 우로 돌아가며 만날 수 있는 사람을 찾고 카운트를 증

 

통과한 코드

import java.util.*;
import java.io.*;

public class Main {
    public static char map[][];
    public static boolean visited[][];
    public static int dx[] = {0, 0, 1, -1};
    public static int dy[] = {1, -1, 0, 0};
    public static int n, m, cnt;
    public static int cx, cy;
    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];
        visited = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            String s = st.nextToken();
            for (int j = 0; j < m; j++) {
                if(s.charAt(j)=='I'){
                    cx=i;
                    cy=j;
                }
                map[i][j] = s.charAt(j);
            }
        }

        dfs(cx,cy);
        check();
    }

    public static void dfs(int x, int y) {
        visited[x][y] = true;
        if(map[x][y]=='P') cnt++;

        for (int i = 0; i < 4; i++) {
            int cx = x + dx[i];
            int cy = y + dy[i];

            if (cx >= 0 && cy >= 0 && cx < n && cy < m ) {
                if (!visited[cx][cy] && map[cx][cy] != 'X') {
                    dfs(cx, cy);
                }
            }
        }
    }

    public static void check() {
        if (cnt <= 0) {
            System.out.println("TT");
        } else {
            System.out.println(cnt);
        }
    }
}