아무코딩

[백준 2573] 빙산 본문

알고리즘/백준

[백준 2573] 빙산

동 코 2020. 4. 27. 19:43

쉬운문젠데 생각보다 걸렸다..

저지른 실수가 너무 많았다..

dfs를 할때 시작 visited 처리, 카운터 증가, 음수 처리 등 평소에 잘 안하는 실수가 잦았다..

문제 자체는 되게 평이하다.

 

첫줄 마지막줄이 항상 0이라는 조건이 있어서  범위끝처리가 필요없어서 좋았다.

문제풀이

 

첫줄 마지막줄이 항상 0이라는 조건이 있어서  범위끝처리가 필요없어서 좋았다.

 

높이가 0보다큰빙산을 벡터에 저장하고 감소 연산을 한뒤에 따로 맵에서 한꺼번에 빼주었다. 이렇게하면 접근도 빠르고 녹을 때 먼저 0이되어 데이터의 오류가 나는 일이 없다. 

 

그리고 빙산의 분리는 빙산전체 카운트와 시작점부터 dfs를하여 갯수 비교를 통해 진행하였다.

 

소스코드

더보기
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
110
111
112
113
114
115
116
#include <iostream>
#include <queue>
#include <algorithm>
 
using namespace std;
int row_size;
int col_size;
int Map[301][301];
bool visited[301][301];
 
 
typedef struct Ice{
    int height;
    int row;
    int col;
    Ice(int h,int r,int c){
        height =h;
        row =r;
        col =c;
    }
}Ice ;
 
vector<Ice> ices;
int dir_row[4= {-1,0,1,0};
int dir_col[4= {0,1,0,-1};
int connected_cnt=0;
bool cmp(Ice &a, Ice &b){
    return a.height>b.height;
}
 
int getReducedHeight(Ice ice){
    int cnt=0;
    for(int i=0;i<4;i++){
        int next_row = ice.row+dir_row[i];
        int next_col = ice.col+dir_col[i];
        if(Map[next_row][next_col]<=0){
            cnt++;
        }
    }
    return cnt;
}
 
void meltIces(){
    for(int i=0;i<ices.size();i++){
        int reduced_height = getReducedHeight(ices[i]);
        ices[i].height -=reduced_height;
    }
    for(int i=0;i<ices.size();i++){
        Map[ices[i].row][ices[i].col] =ices[i].height<0?0:ices[i].height;
    }
}
 
void initVisited(){
    for(int i=0;i<row_size;i++){
        for(int j=0;j<col_size;j++){
            visited[i][j] = false;
        }
    }
}
void dfs(int row, int col){
    for(int i=0;i<4;i++){
        int next_row = row + dir_row[i];
        int next_col = col + dir_col[i];
        if(Map[next_row][next_col]>0 && visited[next_row][next_col]==false){
            connected_cnt++;
            visited[next_row][next_col]=true;
            dfs(next_row,next_col);
        }
    }
}
 
int main() {
    cin>>row_size>>col_size;
    for(int i=0;i<row_size;i++){
        for(int j=0;j<col_size;j++){
            cin>>Map[i][j];
            if(Map[i][j] !=0){
                ices.push_back(Ice(Map[i][j],i,j));
            }
        }
    }
    int year=0;
    while(1){
        year++;
        meltIces();
//        cout<<year<<"년"<<endl;
//        for(int i=0;i<row_size;i++){
//            for(int j=0;j<col_size;j++){
//                cout<<Map[i][j]<<" ";
//            }
//            cout<<endl;
//        }
        sort(ices.begin(),ices.end(),cmp);
        while(!ices.empty()&&ices[ices.size()-1].height<=0){
            ices.pop_back();
        }
        if(ices.empty()){
            cout<<"0"<<endl;
            return 0;
        }
        connected_cnt=1;
        initVisited();
        visited[ices[0].row][ices[0].col]=true;
        dfs(ices[0].row,ices[0].col);
        if(connected_cnt<ices.size()){
//            cout<<connected_cnt<<","<<ices.size()<<endl;
            cout<<year<<endl;
            return 0;
        }
    }
    
    
    
    return 0;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs
 

문제 링크 : https://www.acmicpc.net/problem/2573

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 나타내는 M개의 정수가 한 개의 빈 칸을 사이에 두고 주어진다. 각 칸에 들어가는 값은 0 이상 10 이하이다. 배열에서 빙산이 차지하는 칸의 개수, 즉, 1 이상의 정수가 들어가는 칸의 개수는 10,000 개 이하이다. 배열의 첫 번째 행과 열, 마지

www.acmicpc.net

 

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

[백준 14499] 주사위 굴리기  (0) 2020.05.06
[백준 14888] 연산자 끼워넣기  (0) 2020.04.28
[백준 11559] Puyo Puyo  (0) 2020.04.25
[백준 3190] 뱀  (0) 2020.04.22
[백준 14891] 톱니바퀴  (0) 2020.04.21
Comments