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

 

3109번: 빵집

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

www.acmicpc.net

코드설명

그리디 + DFS를 활용하여 해결할 수 있는 문제입니다.

 

이 문제에서 가장 중요한 그리디 개념은, 

만약 첫번째 행에서부터 아래의 행으로 파이프를 설치하기 시작한다면,

각 칸은 오른쪽 위 대각선, 오른쪽, , 오른쪽 아래 대각선 이 순서대로 순서를 보장해야합니다.

만약 맨 아래의 행에서부터 첫번째 행으로 파이프를 설치하기 시작한다면, 

각 칸은 오른쪽 아래 대각선, 오른쪽, 오른쪽 위 대각선 이 순서대로 순서를 보장해야합니다.

 

이러한 개념이 일종의 그리디 개념으로 쓰입니다.

 

두번째, DFS 진행시에 flag == true일때 해당 위치에 도달한 것으로 판정하는데 이떄 아직 DFS를 진행중인 반복문에도 중단처리를해야합니다.

if(flag == true) continue;

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int R, C;
public static char[][] map;
public static boolean[][] visited;
public static int answer = 0;
public static boolean flag = false;
public static int[] dx = {-1,0,1}; //우상, 우, 우하
public static int[] dy = {1,1,1}; //우상, 우 , 우하
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];
for(int i=0;i<R;i++) {
st = new StringTokenizer(br.readLine());
map[i] = st.nextToken().toCharArray();
}
visited = new boolean[R][C];
for(int i=0;i<R;i++) {
flag = false;
visited[i][0] = true;
simulate(new Node(i, 0));
if( flag == true) {
answer += 1;
}
}
System.out.println(answer);
}
public static void simulate(Node node) {
if(flag == true) return;
if(node.y == C-1) {
flag = true;
return ;
}
for(int dir=0;dir<3;dir++) {
int nx = node.x + dx[dir];
int ny = node.y + dy[dir];
if(nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
if(visited[nx][ny] == true) continue;
if(map[nx][ny] == 'x') continue;
if(flag == true) continue;
visited[nx][ny] = true;
simulate(new Node(nx, ny));
}
}
}
class Node{
int x;
int y;
public Node(int x, int y) {
this.x=x;
this.y=y;
}
}

 

+ Recent posts