🔎문제

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

 

3109번: 빵집

유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던

www.acmicpc.net

 

💡풀이

왼쪽에서 오른쪽으로, 건물을 피해서 파이프라인을 설치한다.

이때 주의할 점이 있다. 문제에는 '각 칸은 오른쪽, 오른쪽 위 대각선, 오른쪽 아래 대각선으로 연결할 수 있다' 고 되어있지만, 오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선 순서로 봐야 한다는 것이다.

최대한 위쪽으로 파이프를 밀착시켜 최대한 많은 파이프를 설치하도록 하는 것이다.

 

또, 이미 탐색했지만 파이프가 설치되지 않은 곳은 더 이상 방문해도 해당 지점을 지나 만들수있는 파이프는 없다는 뜻이므로 다시 방문하지 않는다.

 

따라서 그리디 + DFS를 활용한 문제이다.

 

📃소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {

    public static int r;
    public static int c;
    public static int[] dx = {-1, 0, 1}; // 오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선
    public static int[] dy = {1, 1, 1};
    public static char[][] matrix;
    public static boolean[][] visited;

    public static boolean dfs(int x, int y) {
        if (y == c - 1) {
            return true;
        }

        for (int i = 0; i < 3; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (0 <= nx && nx < r && 0 <= ny && ny < c &&
                !visited[nx][ny] && matrix[nx][ny] == '.') {
                visited[nx][ny] = true;
                if (dfs(nx, ny)) return true;
            }
        }

        return false;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        matrix = new char[r][c];
        visited = new boolean[r][c];
        for (int i = 0; i < r; i++) matrix[i] = br.readLine().toCharArray();

        int cnt = 0;
        for (int i = 0; i < r; i++) {
            if (matrix[i][0] == 'x') continue;
            if (dfs(i, 0)) cnt++;
        }

        System.out.println(cnt);
    }
}