공부공간

SWEA ) 등산로 조성 본문

알고리즘/완전탐색(BFS,DFS)

SWEA ) 등산로 조성

개발자가될수있을까? 2020. 2. 5. 20:56

문제 ↓

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq&categoryId=AV5PoOKKAPIDFAUq&categoryType=CODE


등산로를 개척하면서 단 한 경로의 높이를 낮추어서

 

최장거리의 경로를 구하는 문제이다.

 

이경우 N이 충분히 작기때문에 DFS로 해결이 가능했지만,

 

N이 크다면 BFS + 백트래킹 + VISIT배열변경 등의 

 

다양한 방법으로 접근해야 했었던 문제이다.

 

 

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

 

2206번: 벽 부수고 이동하기

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동

www.acmicpc.net

비슷한 문제 같지만, 위문제를 DFS로 제출했더니 바로 시간초과가 났다..

 


문제에 접근방법은 DFS를 통한 경로를 탐색하면서 자기보다 큰 값을 만났을때 ( K ) 0부터 K까지의

 

값을 빼보면서 경로를 진행하는 것이다. 

 

그리고 맵을 변경했다는 BOOLEAN변수로 경로에서 단 한번만 변경이 가능하게 하면서 탐색한다.

 

전체 탐색이 완료되면 가장 긴 경로를 답으로 선택한다.


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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
public class Solution {
    static int T,N,K,cnt=0, h_max, res,answer;
    static int map[][];
    static boolean visit[][];
    static int heightest_pos[][];
    static int dx[] = {0,0,-1,1};
    static int dy[] = {-1,1,0,0};
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     
    public static void input() throws Exception {
         
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken())+1;
        K = Integer.parseInt(st.nextToken());
        map = new int[N][N];
        visit = new boolean[N][N];
         
        h_max = -1;
         
        for (int y = 1 ; y <N ; y++) {
            st = new StringTokenizer(br.readLine());
            for(int x = 1 ;x <N ; x++) {
                map[y][x] = Integer.parseInt(st.nextToken());
                h_max = Math.max(h_max, map[y][x]);
            }
        }
         
        heightest_pos = new int[5][2];
         
        for(int y= 1; y < N ; y++){
            for(int x=1; x< N; x++){
                if(map[y][x]== h_max){
                    heightest_pos[cnt][0= y; // 0 은 y
                    heightest_pos[cnt][1= x; // 1 은 x
                    cnt++;
                }
            }
        }
    }
     
    public static void DFS(int y, int x ,boolean breakor, int len , int now_h) {
         
        res = Math.max(res, len);
         
        for(int index = 0 ; index < 4 ; index++) {
             
            int nx = x + dx[index];
            int ny = y + dy[index];
             
            if(nx >=1 && ny >=1 && nx < N && ny < N) {
                 
                if(map[ny][nx] < now_h && !visit[ny][nx]){
                     
                    visit[ny][nx] = true;
                    DFS(ny,nx,breakor,len+1 , map[ny][nx]);
                    visit[ny][nx] = false;
                }
                else if((map[ny][nx] - K < now_h) && !breakor && !visit[ny][nx]) {
                     
                    for(int hh =1 ; hh <=K ; hh++) {
                         
                        if(map[ny][nx] - hh < now_h){
                             
                            breakor= true;
                            visit[ny][nx] = true;
                            DFS(ny,nx,breakor,len+1, map[ny][nx] -hh);
                            visit[ny][nx] = false;
                            breakor =false;
                        }
                    }
                }
            }
        }
    }
     
    public static void main(String[] args) throws Exception{
        T = Integer.parseInt(br.readLine().trim());
        for(int tc =1 ; tc<=T ;tc++) {
            input();
            for(int index=0; index< cnt; index++) {
                int y = heightest_pos[index][0];
                int x = heightest_pos[index][1];
                visit[y][x] = true;
                DFS( y, x, false,1, h_max);
                visit[y][x] = false;
                answer = Math.max(answer, res);
            }
         
            System.out.println("#"+tc+" "+answer);
            answer =0; res =0; cnt =0;
        }
    }
 
     
}
 
 

'알고리즘 > 완전탐색(BFS,DFS)' 카테고리의 다른 글

BOJ - 17406 ) 배열돌리기4  (0) 2020.02.11
SWEA ) 벽돌깨기  (0) 2020.02.09
BOJ - 17136 ) 색종이 붙이기  (0) 2020.02.04
BOJ - 17135 ) 캐슬디펜스  (2) 2020.02.02
BOJ - 16637 ) 괄호추가하기  (0) 2020.02.02
Comments