일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준
- 젠킨스
- 자바
- bfs
- 2018 KAKAO BLIND RECRUITMENT
- 2018 KAKAO BLIND RECRUITMENT 1차
- 2018 카카오 공채
- CS 스터디
- gcp
- Baekjoon
- 카카오
- c++
- gradle
- set
- 삼성 SW 역량테스트
- 2018 카카오
- Java
- 2019 카카오 공채
- 비트마스크
- 2019 KAKAO BLIND RECRUITMENT
- dfs
- 삼성 SW 기출문제
- 알고리즘
- 부스트코스
- 2020 KAKAO BLIND RECRUITMENT
- 카카오 공채
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- map
- 2020 카카오 공채
- 프로그래머스
Archives
- Today
- Total
아무코딩
[백준 11559] Puyo Puyo 본문
문제풀이
간단한 시뮬레이션 문제이다. 시뮬레이션을 오랜만에 풀어서 그런가.. visited 초기화를 매번해주지않아 빨리 풀 문제에 시간을 좀 쓴거같다. 덕분에 xcode에서 디버깅하는 법을 터득했다..
소스코드
더보기
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#define ROW_SIZE 12
#define COL_SIZE 6
using namespace std;
int Map[ROW_SIZE][COL_SIZE];
int dir_row[4] = {1,0,-1,0};
int dir_col[4] = {0,-1,0,1};
bool visited[ROW_SIZE][COL_SIZE];
vector<pair<int,int>> sameGroup;
bool isChanged=false;
bool isPuyo(int next_row, int next_col){
if(next_row<0||next_col<0||next_row>=ROW_SIZE||next_col>=COL_SIZE)
return false;
if(Map[next_row][next_col]=='.')
return false;
if(visited[next_row][next_col])
return false;
return true;
}
void dfs(int r, int c,int color){
for(int i=0;i<4;i++){
int next_row = r+ dir_row[i];
int next_col = c + dir_col[i];
if(isPuyo(next_row, next_col)){
if(Map[next_row][next_col] == color){ //같은 경우
visited[next_row][next_col] =true;
sameGroup.push_back(make_pair(next_row,next_col));
dfs(next_row,next_col,color);
}
}
}
}
//void printMap(){
// for(int i=0;i<ROW_SIZE;i++){
// for(int j=0;j<COL_SIZE;j++){
// printf("%3d ",Map[i][j]);
// }
// printf("\n");
// }
//}
void eraseSameGroup() {
for(int i=0;i<ROW_SIZE;i++){
for(int j=0;j<COL_SIZE;j++){
if(Map[i][j]>0&&!visited[i][j]){
sameGroup.push_back(make_pair(i,j));
visited[i][j]=true;
dfs(i,j,Map[i][j]);
if(sameGroup.size()>=4){
isChanged = true;
for(int k=0;k<sameGroup.size();k++){
int row = sameGroup[k].first;
int col = sameGroup[k].second;
Map[row][col]=-1;
}
// printf("\n한색삭제후\n");
// printMap();
}
}
}
}
}
void arrangeCol(int r,int c){
int cnt=0;
for(int i=r;i>=0;i--){
if(Map[i][c]==-1){
cnt++;
}
else{
break;
}
}
for(int i=r;i>=0;i--){
if(i-cnt>=0)
Map[i][c] = Map[i-cnt][c];
else
Map[i][c]=0;
}
}
void initVisited(){
for(int i=0;i<ROW_SIZE;i++){
for(int j=0;j<COL_SIZE;j++){
visited[i][j] = false;
}
}
}
int main() {
for(int i=0;i<ROW_SIZE;i++){
for(int j=0;j<COL_SIZE;j++){
char input;
while(1){
scanf("%c",&input);
Map[i][j] = input;
if(input == '.'){//빈공간
Map[i][j] = 0;
break;
}
else if(input>='A' && input<='Z'){//색
Map[i][j] = input-'A'+1;
break;
}
}
}
}
//4개씩 dfs로 없애기
int result=0;
while(1){
isChanged =false;
initVisited();
eraseSameGroup();
if(!isChanged)
break;
result++;
// printf("\n지운후\n");
// printMap();
for(int j=0;j<COL_SIZE;j++){
for(int i=ROW_SIZE-1;i>=0;i--){
if(Map[i][j]==-1){
arrangeCol(i,j);
}
}
}
// printf("\n정렬후\n");
// printMap();
}
printf("%d\n",result);
return 0;
}
|
문제 링크 : https://www.acmicpc.net/problem/11559
'알고리즘 > 백준' 카테고리의 다른 글
[백준 14888] 연산자 끼워넣기 (0) | 2020.04.28 |
---|---|
[백준 2573] 빙산 (0) | 2020.04.27 |
[백준 3190] 뱀 (0) | 2020.04.22 |
[백준 14891] 톱니바퀴 (0) | 2020.04.21 |
[백준 1991] 트리 순회 (0) | 2020.04.17 |
Comments