일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2019 KAKAO BLIND RECRUITMENT
- 2020 KAKAO BLIND RECRUITMENT
- set
- 카카오
- c++
- dfs
- 젠킨스
- gradle
- 2019 카카오 공채
- 부스트코스
- 프로그래머스
- 삼성 SW 기출문제
- Baekjoon
- 알고리즘
- CS 스터디
- 카카오 공채
- 백준
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 2018 KAKAO BLIND RECRUITMENT 1차
- bfs
- 삼성 SW 역량테스트
- 2020 카카오 공채
- 자바
- 2018 카카오 공채
- map
- 비트마스크
- gcp
- 2018 KAKAO BLIND RECRUITMENT
- 2018 카카오
- Java
Archives
- Today
- Total
아무코딩
[백준 2573] 빙산 본문
쉬운문젠데 생각보다 걸렸다..
저지른 실수가 너무 많았다..
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++){
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);
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
'알고리즘 > 백준' 카테고리의 다른 글
[백준 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