본문 바로가기
삼성 코팅테스트 준비/모의 역량 테스트 문제

1949 등산로 조성

by tryotto 2020. 3. 7.
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
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <string.h>
#include <vector>
 
using namespace std;
 
int width, cut_max;
int rst_path;
int mountain[10][10];
int dx[4= { 00-11 };
int dy[4= { -1100 };
int flag[10][10];
vector<pair<intint> > summit;
 
void initialize();
void path(int y, int x, int depth);
 
int main() {
    int test;
    scanf("%d"&test);
 
    for (int t = 1; t <= test; t++) {
        initialize();
 
        for (int k = 1; k <= cut_max; k++
            for (int i = 1; i <= width; i++
                for (int j = 1; j <= width; j++) {
                    if (mountain[i][j] - k < 0)
                        continue;
            
                    mountain[i][j] -= k;
 
                    for (int h = 0; h < summit.size(); h++) {
                        int y = summit[h].first;
                        int x = summit[h].second;
                        
                        // flag 초기화
                        memset(flag, 0sizeof(flag));
 
                        // 각각의 summit 기준 경로 찾기
                        flag[y][x] = 1;
                        path(y, x, 1);
                        flag[y][x] = 0;
                    }
 
                    mountain[i][j] += k;
                }
        
        printf("#%d %d\n", t, rst_path);
    }
}
 
void path(int y, int x, int depth) {
    int cnt = 0;
    for (int i = 0; i < 4; i++) {
        int xx = x + dx[i];
        int yy = y + dy[i];
 
        if (xx <= 0 || xx > width || yy <= 0 || yy > width)
            continue;
 
        int cur_height = mountain[y][x];
        int next_height = mountain[yy][xx];
        if (cur_height <= next_height)
            continue;
 
        if (flag[yy][xx] == 0) {
            flag[yy][xx] = 1;
            path(yy, xx, depth + 1);
            flag[yy][xx] = 0;
 
            cnt++;
        }
    }
 
    if (cnt == 0) {
        if (depth > rst_path) {
            rst_path = depth;
        }
    }
}
 
void initialize() {
    // scanf
    scanf("%d %d"&width, &cut_max);
 
    // rst_summit 초기화
    rst_path = 0;
 
    // num_summit
    int max_summit = -1;
    for (int i = 1; i <= width; i++) {
        for (int j = 1; j <= width; j++) {
            scanf("%d"&mountain[i][j]);
 
            if (max_summit < mountain[i][j]) {
                while (!summit.empty())
                    summit.pop_back();
 
                max_summit = mountain[i][j];
                summit.push_back(make_pair(i, j));
            }
            else if (max_summit == mountain[i][j]) {
                summit.push_back(make_pair(i, j));
            }
        }
    }
}
 
cs



설마 이 방법으로 풀릴까 싶었는데 풀렸다..

시간복잡도가 엄청날 것 같아서 쫄려서 안풀고 있었는데..
댓글들 보니 내가 생각했던 방식 그대로 풀길래
나도 그냥 시도해봤다

코드 자체는 엄청 단순하다
걍 노가다 + DFS 방식 으로 처리를 했다

다행히 이제 DFS나 BFS 같은 방식의 문제는 엄청 수월하게 풀린다

시간복잡도에 대한 고민이나, 
적용이 조금 생소한 자료구조들에 대해서는 추가적인 공부가 필요할 것 같다


'삼성 코팅테스트 준비 > 모의 역량 테스트 문제' 카테고리의 다른 글

해결) 5653 줄기세포 배양  (0) 2020.03.07
2382 미생물 격리  (0) 2020.03.06
2117 홈 방범 서비스  (0) 2020.03.05
4014 활주로 건설  (0) 2020.03.04
1953 탈주범 검거  (0) 2020.03.04