본문 바로가기

ProgramSoliving

백준 : 3109

반응형

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

 

3109번: 빵집

문제 유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던 중에, 가스비가 제일 크다는 것을 알게되었다. 따라서 원웅이는 근처 빵집의 가스관에 몰래 파이프를 설치해 훔쳐서 사용하기로 했다. 빵집이 있는 곳은 R*C 격자로 표현할 수 있다. 첫째 열은 근처 빵집의 가스관이고, 마지막 열은 원웅이의 빵집이다. 원웅이는 가스관과 빵

www.acmicpc.net

문제를 보다가 최대의 파이프를 설치하는 경우의수는 출발점에서 미로찾기처럼 위쪽벽을 따라서 파이프를 연결하면 된다는 것을 알았다. 이방법으로 로직을 구현했을경우 처음 설계는 처음 출발한 파이프가 벽에 만나서 더이상 나아갈수 없으면 이전까지 방문했던 모든 노드들을 true->false다시 패일로 처리해주고 지나온길을 백트래킹하면서 청소하는 방법을 선택했다. 이런경우 예제에 정답은 나온다.

하지만 제출할경우 시간초과가 발생하였다.
근데 공곰이 생각해본결과 만약 위쪽노드가 실패한 노드를 아래쪽 노드가 그쪽으로 간다고해서 그길을 성공할수가 없다. 따라서 위족노드가 실패한 경로의 방문 경로도 true인채로 그대로해둔다음 소스를 실행하니 AC를 받을수가 있었다.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
 
public class 빵집 {
    static int R, C;
    static char[][] map;
    static int dy[] = { -101 };
    static int dx[] = { 111 };
    static int Answer;
    static boolean visit[][];
    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++) {
            map[i] = br.readLine().toCharArray();
        }
        
        visit = new boolean[R][C];
        Answer = 0;
        
        for(int r=0;r<R;r++) {
            visit[r][0= true;
            if(DFS(r,0)) {
                Answer++;
            }else {
                visit[r][0= false;
            }
        }
        System.out.println(Answer);
 
    }
    public static boolean DFS(int r, int c) {
        if(c == C-1) {
            return true;
        }
        
        for(int d=0;d<3;d++) {
            int ny = r+dy[d];
            int nx = c+dx[d];
            if(ny<0||ny>=R)continue;
            if(map[ny][nx]=='x')continue;
            if(visit[ny][nx]) continue;
            
            visit[ny][nx] = true;
            if(DFS(ny,nx)) {
                return true;
            }
//            시간초과 발생 코드
//            else {
//                visit[ny][nx] =false;
//            }
            
        }
        return false;
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1707  (0) 2020.02.22
백준 : 4179  (0) 2020.02.20
백준 : 2842 JAVA  (2) 2020.02.15
백준 : 11279  (0) 2020.02.09
백준 : 16637  (0) 2020.02.09