[BJ3109] 빵집

 백준 - 빵집 

문제 링크

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

 

3109번: 빵집

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

www.acmicpc.net

 

문제 입출력

5 5
.xx..
..x..
.....
...x.
...x.
2

 

문제 풀이

//package problem.BJ;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;


public class Main {
	static int ans, R, C;
	static char[][] map;

	// 우선순위가 존재
	// 오른쪽위, 오른쪽, 오른쪽아래
	static int[] dy = { -1, 0, 1 };
	static int[] dx = { 1, 1, 1 };

	static Queue<int[]> q = new ArrayDeque<>();


	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("input.txt"));
		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];
		for (int i = 0; i < R; i++) map[i] = br.readLine().toCharArray();

		// 탐색 dfs
		for (int i = 0; i < R; i++) if (dfs(i, 0)) ans++;

		// 탐색 bfs -> 틀렸다고 나옴
		// for (int i = 0; i < R; i++) if (bfs(i, 0)) ans++;

		System.out.println(ans);

	} // end main


	private static boolean dfs(int y, int x) {
		map[y][x] = 'x';

		if (x == C - 1) return true;

		for (int d = 0; d < 3; d++) {
			int ny = y + dy[d];
			int nx = x + dx[d];

			if (ny < 0 || ny >= R || nx < 0 || nx >= C) continue;
			if (map[ny][nx] == 'x') continue;

			// for (int i = 0; i < R; i++) System.out.println(Arrays.toString(map[i]));
			// System.out.println();

			if (dfs(ny, nx)) return true;
		}

		return false;

	} // end dfs


	private static boolean bfs(int sy, int sx) {
		q.offer(new int[] { sy, sx });
		map[sy][sx] = 'x';

		while (!q.isEmpty()) {
			int[] yx = q.poll();
			int y = yx[0];
			int x = yx[1];

			map[y][x] = 'x';

			if (x == C - 1) return true;

			for (int d = 0; d < 3; d++) {
				int ny = y + dy[d];
				int nx = x + dx[d];

				if (ny < 0 || ny >= R || nx < 0 || nx >= C) continue;
				if (map[ny][nx] == 'x') continue;

				q.offer(new int[] { ny, nx });
				break;
			}

		}

		return false;

	} // end bfs
}
  • dfs 로 풀 수 있는 문제 
  • 만약 한 파이프라인을 뚫으면 true 로 리턴을 해서 수를 셉니다.
  • true 인 것들만 세는 것입니다. 즉 끝 열까지 간 파이프라인들만.
  • bfs 로 풀어보려고 했지만 이상하게도 8%에서 멈춥니다.

 

 

 

➕ 비슷한 문제

https://yeomss.tistory.com/119?category=985628 

 

[TC0501] [DFS/BFS] 음료수 얼려 먹기

🚩 문제 설명 N x M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는

yeomss.tistory.com

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

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

 

 

 

 

 

 

 

 

# 백준 빵집 dfs # 백준 빵집 bfs # bj 빵집 java # 백준 빵집 java


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 백준 알고리즘' 카테고리의 다른 글

[BJ1697] 숨바꼭질  (2) 2022.09.11
[BJ9663] N-Queen  (0) 2022.09.11
[BJ2667] 단지 번호 붙이기  (0) 2022.09.05
[BJ2606] 바이러스  (0) 2022.09.04
[BJ2628] 종이 자르기  (0) 2022.08.09