https://www.acmicpc.net/problem/3109
3109번: 빵집
유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던
www.acmicpc.net
DFS + 그리디 문제이다
문제 푸는데 오래 걸렸지만 막상 코드 보면 설명할 내용은 없는 것 같다
다른 탐색과는 다르게 방향을 지정하는 delta 배열에서
값을 넣어주는 순서가 중요하다는 정도?
그리디로 풀어야하기 때문에 오른쪽 위 / 오른쪽 / 오른쪽 아래 순서로 탐색하면 된다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int R, C, ANS;
static char map[][];
static int deltas[][] = {
{-1, 1},
{0, 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());
String str;
int i, j;
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new char[R][C];
for(i=0; i<R; i++) {
str = br.readLine();
for(j=0; j<C; j++) {
map[i][j] = str.charAt(j);
}
}
for(i=0; i<R; i++) {
solve(i, 0);
}
System.out.println(ANS);
}
public static boolean solve(int r, int c) {
map[r][c] = '!';
if(c == C-1) {
ANS++;
return true;
}
int dr, dc;
boolean flag = false;
for(int d=0; d<3; d++) {
dr = r + deltas[d][0];
dc = c + deltas[d][1];
if(dr >= 0 && dr < R && dc >=0 && dc < C) {
if(map[dr][dc] == '.') {
flag = solve(dr, dc);
if(flag)
break;
}
}
}
return flag;
}
}
배관을 끝까지 연결했는지 확인할 flag를 하나 만들고
마지막 열에 도달했으면 flag를 true로 지정한 다음 리턴한다
생각하기는 어려웠는데 막상 코드를 보니 되게 간단하다는 생각이 많이 든다..
정답으로 잘 나온다
5 7
.x...x.
.x...x.
.x.....
.......
.......
ans 2
100 5
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
...x.
...x.
.....
...x.
...x.
...x.
.....
.....
..x..
..x..
.....
..x..
.....
..x..
.....
ans 92
5 5
.xx..
..x..
.....
...x.
...x.
ans 2
'공부하자 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 2559번 - 수열 [Java, Python] (0) | 2023.06.05 |
---|---|
백준 알고리즘 2615번 - 오목 [Java] (0) | 2022.06.19 |
백준 알고리즘 1074번 - Z [Python] (0) | 2021.12.24 |
백준 알고리즘 12865번 - 평범한 배낭 [C] (0) | 2021.09.12 |
백준 알고리즘 1011번 - Fly me to the Alpha Centauri (C 언어) (0) | 2021.02.11 |