백준 5212번: 지구 온난화 (C++)
2023. 2. 22. 09:30ㆍ알고리즘/구현

https://www.acmicpc.net/problem/5212
5212번: 지구 온난화
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
www.acmicpc.net
풀이
언뜻 보면 BFS / DFS 문제 같지만 섬인 부분만 체크하면 되는 조금 생각해야하는 구현 문제다.
그래프 탐색 유형처럼 접근하긴 했는데 map 에서 X 인 부분의 상하좌우를 확인했다.
X 의 상하좌우가 map 의 밖에 있거나 바다일 경우 cnt 를 하나씩 늘려주었고
cnt >= 3 일때 X 를 임시로 a 로 바꿔주었다.
지도를 줄이는 부분에서 조금 생각해야할 부분이 있었는데
다시 map 을 탐색하면서 X 인 부분이 있을 때마다 최소 x, y 좌표와 최대 x, y 좌표를 갱신했다.
그리고 임시로 바꿔준 a 는 ' . ' 으로 다시 바꿔주었고
최소 x, y 좌표와 최대 x, y 좌표를 기준으로 map 을 출력했다.
전체 코드
#include <iostream>
#include <algorithm>
using namespace std;
int R, C;
char map[13][13];
int goY[4] = { 0,0,1,-1 }, goX[4] = { 1,-1,0,0 };
int minY = 987654321, minX = 987654321;
int maxY = 0, maxX = 0;
bool is_in_board(int y, int x) {
if (y < 0 || x < 0 || y >= R || x >= C) return false;
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) cin >> map[i][j];
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] == 'X') {
int cnt = 0;
for (int k = 0; k < 4; k++) {
int nextY = i + goY[k], nextX = j + goX[k];
if (!is_in_board(nextY, nextX)) {
cnt++;
continue;
}
if (map[nextY][nextX] == '.') cnt++;
}
if (cnt >= 3) map[i][j] = 'a';
}
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] == 'a') map[i][j] = '.';
if (map[i][j] == 'X') {
if (i <= minY) minY = i;
if (j <= minX) minX = j;
if (i >= maxY) maxY = i;
if (j >= maxX) maxX = j;
}
}
}
for (int i = minY; i <= maxY; i++) {
for (int j = minX; j <= maxX; j++) cout << map[i][j];
cout << '\n';
}
}
'알고리즘 > 구현' 카테고리의 다른 글
백준 9047번: 6174 (C++) (0) | 2023.02.17 |
---|---|
백준 2920번: 음계 (C++) (0) | 2023.01.26 |
백준 17128번: 소가 정보섬에 올라온 이유 (C++) (0) | 2023.01.21 |
백준 1292번: 쉽게 푸는 문제 (C++) (0) | 2023.01.18 |
백준 1652번: 누울 자리를 찾아라 (C++) (0) | 2023.01.18 |