티스토리 뷰

알고리즘/BOJ

[백준] 3109 빵집

세진짱 2020. 2. 14. 14:29

 

DFS+ 그리디를 이용해서 풀 수 있다

우선 지나간 길은 지나갈 수 없으므로 길을 지나갈 때 마다 x로 바꿔주자

그리고 우리가 봐야할 방향은 위부터 봐야 아래 남아있는 정점에 대해 이득이다

 

따라서 위부터 아래로 시작점에서 dfs를 돌리며 끝까지 가는지 체크를 해보자!

 

문제의 핵심은 dfs를 조금 변형하는 부분에 있다고 생각한다

내가 만약 x행의 끝부분까지 간다면 true를 리턴해주면 된다!

아니라면 false~~!

 

결국 도착하는 사람들은 true를 통해 갈 수 있다고 답을 알려준다...!

dfs 열공하자

 

소스코드 (C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
int n, m;
int dx[3= { -1,0,1 };
int dy[3= { 1,1,1 };
 
char map[10010][505];
 
bool inner(int x, int y) {
    return (0 <= x && x < n && 0 <= y && y < m);
}
bool dfs(int x, int y) {
    map[x][y] = 'x';
    if (y == m - 1return true;
    for (int i = 0; i < 3; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (inner(nx, ny) && map[nx][ny] == '.') {
            if (dfs(nx, ny)) return true;
        }
    }
    return false;
}
int main() {
    scanf(" %d %d"&n, &m);
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf(" %1c"&map[i][j]);
        }
    }
    int ans = 0;
    for (int i = 0; i < n; i++) ans += dfs(i, 0);
    printf("%d\n", ans);
}
 
 

 

소스코드(Java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.Scanner;
 
public class Main {
    public static int n,m;
    public static int[] dx= {-1,0,1};
    public static int[] dy= {1,1,1};
    public static char[][] map;
    
    public static boolean inner(int x,int y) {
        return (0<=&& x<&& 0<=&& y<m);
    }
    
    public static boolean dfs(int x,int y) {
        map[x][y] = 'x';
        if(y==m-1return true;
        for(int i=0;i<3;i++) {
            int nx = x+dx[i];
            int ny = y+dy[i];
            if(inner(nx,ny)&&map[nx][ny]=='.') {
                if(dfs(nx,ny)) return true;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        map = new char[n+1][m+1];
        
        for(int i=0;i<n;i++) {
            String s = sc.next();
            for(int j=0;j<m;j++) map[i][j]= s.charAt(j);
        }
        int ans=0;
        for(int i=0;i<n;i++) {
            if(dfs(i,0)) ans++;
        }
        System.out.println(ans);
    }
}
 
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 16932 모양 만들기  (0) 2020.03.06
[백준] 2580 스도쿠  (0) 2020.02.18
[백준] 17281 ⚾  (0) 2020.02.09
[백준] 17471 게리맨더링  (0) 2020.02.08
[백준] 16637 괄호 추가하기  (0) 2020.02.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함