λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”Ž Algorithm/πŸ’» 문제 풀이

[λ°±μ€€] 3109. 빡집

by Seongpyo Hong 2021. 2. 19.


풀이

DFSλ₯Ό 톡해 탐색을 진행할 λ•Œ μ΅œλŒ€κ°’μ„ μ°ΎλŠ” κ²½μš°λŠ” λŒ€λΆ€λΆ„ λͺ¨λ“  경우의 수λ₯Ό 확인해야 ν•˜κΈ° λ•Œλ¬Έμ— μœ λ§ν•˜μ§€ μ•Šμ€ 경우 κ°€μ§€μΉ˜κΈ°ν•˜λŠ” λ°±νŠΈλž˜ν‚Ή 방법을 μ‚¬μš©ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ 이 λ¬Έμ œλŠ” μ‹œμž‘ 점은 κ°€μž₯ μœ„μ—μ„œλΆ€ν„° μ—°κ²°ν•  수 μžˆλŠ” κ²½μš°μ—λŠ” μ—°κ²°ν•˜λŠ” κ²½μš°κ°€ μ΅œμ„ μ˜ 방법이 λ˜λŠ” κ·Έλ¦¬λ””ν•œ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜μ˜€κ³  이λ₯Ό 톡해 μœ λ§ν•˜μ§€ μ•Šμ€ 경우 탐색을 μ’…λ£Œν•˜λŠ” 경우 λ˜λŒμ•„κ°€λŠ” λ°±νŠΈλž˜ν‚Ή 방식을 μ‚¬μš©ν•˜μ˜€λ‹€.  

첫번쨰 μ—΄μ˜ 1번쨰 ν–‰λΆ€ν„° 탐색을 μ§„ν–‰ν•˜κ³ , λ§Œμ•½ C번째 행에 λ„μ°©ν–ˆλ‹€λ©΄ 이번 μ‹œμž‘ μœ„μΉ˜μ—μ„œμ˜ 탐색을 μ’…λ£Œν•œλ‹€. λ‹€μŒ μœ„μΉ˜λ„ λ™μΌν•˜κ²Œ μ§„ν–‰ν•˜λŠ”λ° λ§Œμ•½ μ‹€νŒ¨ν•œλ‹€κ³  ν•˜λ”λΌλ„ λ°©λ¬Έν•œ μœ„μΉ˜μ— λŒ€ν•œ 체크λ₯Ό λ˜λŒλ¦¬μ§€ μ•ŠλŠ”λ‹€. μ™œλƒν•˜λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ—μ„œ νŒŒμ΄ν”„λ₯Ό μ™„μ„±ν•˜μ§€ λͺ»ν–ˆλ‹€κ³  ν•˜λ”λΌλ„ λ’€ μ„ νƒμ§€μ—μ„œ ν•΄λ‹Ή λ°©ν–₯은 λ™μΌν•˜κ²Œ μ‹€νŒ¨ν•˜λŠ” κ²½μš°κ°€ 되기 λ•Œλ¬Έμ΄λ‹€.

그리고 μ€‘μš”ν•œ 뢀뢄은 νƒμƒ‰μ˜ μˆœμ„œκ°€ μœ„ => 쀑간 => μ•„λž˜ μˆœμ„œλ‘œ μ§„ν–‰λ˜μ–΄μ•Όμ§€λ§Œ μ΅œμ„ μ˜ 경우λ₯Ό 찾게 λœλ‹€λŠ” 뢀뢄이닀.

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

public class Solution3109 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static char[][] map;
	static boolean[][] check;
	static int R, C, cnt, max = Integer.MIN_VALUE;
	static boolean isReached;

	public static void main(String[] args) throws IOException {
		String[] input = br.readLine().split(" ");
		R = Integer.parseInt(input[0]);
		C = Integer.parseInt(input[1]);
		map = new char[R][C];
		check = new boolean[R][C];

		for (int i = 0; i < R; i++) {
			char[] line = br.readLine().toCharArray();
			for (int j = 0; j < C; j++) {
				map[i][j] = line[j];
			}
		}
	
		for (int i = 0; i < R; i++) {
			if (isReached) continue;
			isReached = false;
			buildPipe(i, 0);
			if (isReached) {
				isReached = false;
				cnt++;
			}
		}
		System.out.println(cnt);
	}

static void buildPipe(int row, int col) {

	if (col == C - 1) {
		isReached = true;
		return;
	}

	check[row][col] = true;
	if (isvalid(row - 1, col + 1) && !isReached)
		buildPipe(row - 1, col + 1);
	if (isvalid(row, col + 1) && !isReached)
		buildPipe(row, col + 1);
	if (isvalid(row + 1, col + 1) && !isReached)
		buildPipe(row + 1, col + 1);
}

	static boolean isvalid(int row, int col) {
		if (row < 0 || row >= R || map[row][col] == 'x' || check[row][col])
			return false;
		return true;
	}
}

λŒ“κΈ€