Java

[백준 3109] 빵집 (JAVA)

iheeeee6-6 2023. 8. 11. 00:35
728x90

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

 

3109번: 빵집

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

www.acmicpc.net

 

난이도: 골 2

그리디 알고리즘 문제이다.

오른쪽 위, 오른쪽, 오른쪽 아래의 방향으로 움직여야 한다는게 포인트이다!

원웅빵집    다른 곳

      |   ↗ → ↘  |

 

또한 flag값을 생성하여 

길이 완성되면 더 이상 길을 가지 않도록 하고

길 완성에 실패하면 이 길은 못가는 길임을 표시하도록 visited true 한다 

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

public class Main {

	static int r, c;
	static char[][] map;

	static int result=0;
	static int[] dx= {-1,0,1}; //오른쪽위, 오른쪽, 오른쪽아래
	static int[] dy= {1,1,1};
	static boolean[][] visited;
	static boolean check;
	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());

		map = new char[r][c];
		visited=new boolean[r][c];
		for (int i = 0; i < r; i++) {
			char[] arr= br.readLine().toCharArray();
			for (int j = 0; j < c; j++) {
				map[i][j] = arr[j];
			}
		}

		for (int i = 0; i < r; i++) {
			check=false; //길을 완성했는지 여부
			dfs(i, 0);
		}
		
		System.out.println(result);
	}

	static void dfs(int x, int y) {
		if(y==c-1) {
			result++;
			check=true;
			visited[x][y]=true;
			return;
		}
		
		for(int i=0;i<3;i++) {
			int xx = x+dx[i];
			int yy = y+dy[i];
			if(xx<0||yy<0||xx>=r||yy>=c||visited[xx][yy]||map[xx][yy]!='.') continue;
			dfs(xx,yy);
			if(check) { //길 완성했으면 더 이상 움직이지 않아도 됨
				visited[xx][yy]=true;
				return;
			}else { //길 완성 못하면 이 길은 실패라는 표시
				visited[xx][yy]=true;
			}
		}
	}

}