[백준/JAVA] BOJ 1189 - 컴백홈

NAGANG LEE·2024년 1월 16일

알고

목록 보기
50/118

👀 문제

1189번: 컴백홈 ✨ 실버 1

한수는 캠프를 마치고 집에 돌아가려 한다. 한수는 현재 왼쪽 아래점에 있고 집은 오른쪽 위에 있다. 그리고 한수는 집에 돌아가는 방법이 다양하다. 단, 한수는 똑똑하여 한번 지나친 곳을 다시 방문하지는 않는다.

      cdef  ...f  ..ef  ..gh  cdeh  cdej  ...f 
      bT..  .T.e  .Td.  .Tfe  bTfg  bTfi  .Tde 
      a...  abcd  abc.  abcd  a...  a.gh  abc. 
거리 :  6     6     6     8     8    10    6

위 예제는 한수가 집에 돌아갈 수 있는 모든 경우를 나타낸 것이다. T로 표시된 부분은 가지 못하는 부분이다.

문제는 R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면 한수가 집까지도 도착하는 경우 중 거리가 K인 가짓수를 구하는 것이다.


🔑 키포인트

dfs


✍️ 코드

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

public class ComebackHome {
	
	// 상하좌우 
	static int[] dx = { 0, -1, 1, 0 };
	static int[] dy = { 1, 0, 0, -1 };
	
	static int r;
	static int c;
	static int k;
	
	static char[][] graph;
	static int[][] visited;
	static int answer;

	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());
		k = Integer.parseInt(st.nextToken());
		
		graph = new char[r][c];
		visited = new int[r][c];
		
		// 맵의 정보 입력 받기 
		for (int i = 0; i < r; i++) {
			String line = br.readLine();
			for (int j = 0; j < c; j++) {
				graph[i][j] = line.charAt(j);
			}
		}
		
		visited[r-1][0] = 1;
		dfs(r-1, 0, 1);
		System.out.println(answer);
	}
	
	// 집까지 도착하는 거리 계산하는 함
	static void dfs(int x, int y, int cnt) {
		// 도착 
		if (x == 0 && y == c-1) {
			if (cnt == k) {
				answer++;
			}
			return;
		}
		
		// 시작 지점: 왼쪽 아래점, 도착 지점: 오른쪽 
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if (nx >= 0 && nx < r && ny >= 0 && ny < c) {
				if (graph[nx][ny] == '.' && visited[nx][ny] == 0) {
					visited[nx][ny] = 1; // 방문 처리 
					dfs(nx, ny, cnt+1);
					visited[nx][ny] = 0; // 다른 방법에서는 지나갈 수 있도록 방문 처리 해제하기 
				} 
			}	
		}
	}
}

profile
모바일 개발자를 목표로 하고 있어요 💭

0개의 댓글