[백준 실버2] 5212 : 지구 온난화 C++

수민이슈·2023년 11월 24일
0

[C++] 코딩테스트

목록 보기
112/116
post-thumbnail

🖊️ 문제

https://www.acmicpc.net/problem/5212


🖊️ 생각

1. 바다로 변신

바다로 변하는건 진짜 쉬운 것 같다.
인접한 칸을 모두 검사해야 하므로, 배열을 앞뒤로 1칸씩 더 잡아준다.
그 상태에서 4방향 검사하고 총 개수를 세면 됨.

2. 출력 - 땅을 포함하는 가장 작은 직사각형 구하기

인접한 바다들을 출력하지 않는 점이 키포인트 같았다.
처음에는 string형태로 출력해줬는데, 이렇게하면 검색하기가 좀 빡세다.

아예 변화 후를 나타낼 2차원 배열을 하나 더 선언해준다.
(50년 후에는 배열 전체가 뿅!하고 한 번에 바뀌어야 하는데, 기존 배열을 사용하면 인접한 다른 땅이 영향을 받게 된다)

그 맵에 변화 이후를 표현해놓고,
땅이 있는 위치들 기준으로 상하좌우를 구한다.
최소X, 최대X, 최소Y, 최대Y를 구하는데, 각 땅에서 위 값들을 갱신해주면
해당 땅을 포함하는 가장 작은 직사각형을 구할 수 있다.


🖊️ 풀이

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int R, C;
bool map[12][12] = { false, };
bool final[12][12] = { false, };
int dir[2][4] = { {-1, 1, 0, 0}, {0, 0, -1, 1} };

void Solution()
{
	for (int i = 1; i <= R; i++) {
		for (int j = 1; j <= C; j++) {
			if (map[i][j]) {
				int cnt = 0;
				for (int k = 0; k < 4; k++) {
					int nextX = i + dir[0][k];
					int nextY = j + dir[1][k];

					if (!map[nextX][nextY])
						cnt++;
				}
				if (cnt < 3)
					final[i][j] = true;
			}
		}
	}
}

int main()
{
	cin >> R >> C;

	string input;
	for (int i = 1; i <= R; i++) {
		cin >> input;
		for (int j = 1; j <= C; j++) {
			if (input[j-1] == 'X')
				map[i][j] = true;
		}
	}

	Solution();

	int startX = R;
	int startY = C;
	int endX = 0;
	int endY = 0;
	bool check = false;
	for (int i = 1; i <= R; i++) {
		for (int j = 1; j <= C; j++) {
			if (final[i][j]) {
				startX = min(startX, i);
				startY = min(startY, j);
				endX = max(endX, i);
				endY = max(endY, j);
			}
		}
	}

	for (int i = startX; i <= endX; i++) {
		for (int j = startY; j <= endY; j++) {
			if (final[i][j]) cout << 'X';
			else cout << '.';
		}
		cout << '\n';
	}
}

🖊️ 고칠점

쉬운문제 편식 금지 수민아 제발 !

0개의 댓글