Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

Nodaga의 IT 블로그

백준 - 실버 - 헌내기는 친구가 필요해 본문

코딩 테스트

백준 - 실버 - 헌내기는 친구가 필요해

Nodaga 2024. 5. 9. 09:43

https://www.acmicpc.net/problem/21736


문제 설명

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

도연이가 다니는 대학의 캠퍼스는 N x 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를 출력한다.


입출력 예제

입력1

3 5
OOOPO
OIOOX
OOOXP

 

출력1

1

 

입력2

3 3
IOX
OXP
XPP

 

출력2

TT

풀이

문제에서 주어진 I의 좌표에서 시작해 bfs로 이동 가능한 모든 좌표를 탐색하며 P인 칸에 도달할 때마다 숫자 카운트를 세서 최종적으로 0이면 TT를 아니면 그 값을 출력하면 되는 간단한 문제였다.


코드

package Baekjoon.silver;
import java.io.*;
import java.util.*;

// 백준 - 실버 - 헌내기는 친구가 필요해
public class No_21736 {
    static int N, M, sx, sy;
    static String[][] map;
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, 1, 0, -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 String[N + 1][M + 1];

        for(int n = 1; n <= N; n++) {
            String str[] = br.readLine().split("");
            for(int m = 1; m <= M; m++) {
                map[n][m] = str[m - 1];
                if(map[n][m].equals("I")) {
                    sx = n;
                    sy = m;
                }
            }
        }

        int num = bfs(sx, sy);

        if(num == 0) System.out.println("TT");
        else System.out.println(num);
    }

    static int bfs(int x, int y) {
        int num = 0;

        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[] {x, y});

        boolean[][] visited = new boolean[N + 1][M + 1];
        visited[x][y] = true;

        while(!q.isEmpty()) {
            int[] p = q.poll();

            if(map[p[0]][p[1]].equals("P")) num++;

            for(int i = 0; i < 4; i++) {
                int nx = p[0] + dx[i];
                int ny = p[1] + dy[i];

                if(nx >= 1 && ny >= 1 && nx <= N && ny <= M) {
                    if(!map[nx][ny].equals("X") && !visited[nx][ny]) {
                        visited[nx][ny] = true;
                        q.offer(new int[] {nx, ny});
                    }
                }
            }
        }

        return num;
    }
}

'코딩 테스트' 카테고리의 다른 글

백준 - 실버 - 카드1  (0) 2024.05.13
백준 - 실버 - 행렬 곱셈  (0) 2024.05.10
백준 - 실버 - 도시와 비트코인  (0) 2024.05.08
백준 - 실버 - 점프왕 쩰리(Small)  (0) 2024.05.07
백준 - 실버 - 수열  (1) 2024.05.03