[๋ฐฑ์ค€๐Ÿ”‰][16234] ์ธ๊ตฌ์ด๋™ ๋ฌธ์ œ ํ•ด์„ค

Park Ji Youngยท2021๋…„ 1์›” 13์ผ
0

algorithms

๋ชฉ๋ก ๋ณด๊ธฐ
9/26


๐Ÿ‘“ ๋ฌธ์ œ ์š”์•ฝ

1 x 1 ๋ชจ์–‘์˜ ์‚ฌ๊ฐํ˜•์ด n x n ๋งŒํผ ํŽผ์ณ์ง„ ๋•…์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
๊ฐ ์‚ฌ๊ฐํ˜•์€ ๋‚˜๋ผ๋ฅผ ์ง€์นญํ•˜๋ฉฐ ๊ทธ ์•ˆ์—๋Š” ๋ฐฑ์„ฑ๋“ค์˜ ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค.

๋งค์šฐ ์ž์œ ๋กœ์šด ์ด ๋Œ€๋ฅ™์˜ ํŠน์ •ํ•œ ๋‚˜๋ผ๋Š” ๋‹ค๋ฅธ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜์™€ ๋น„์Šทํ•˜๋‹ค๋ฉด ์—ฐํ•ฉ์„ ํ•˜์—ฌ ์—ฐํ•ฉ๊ตญ ๊ฐ„ ์ธ๊ตฌ๋Š” ๊ฐ™์€ ์ˆซ์ž๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๋ฒ•์„ ์ œ์ •ํ–ˆ๋‹ค.

์œ„ ๋ฒ•์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ผ ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

๋ผ๊ณ  ์ƒ๊ฐ ํ•˜๋ฉด ๋จ

์ž์„ธํ•œ ๋ฌธ์ œ ์„ค๋ช…๊ณผ ์ œํ•œ ์‚ฌํ•ญ์€ ๋ฐฑ์ค€ ํ™ˆํŽ˜์ด์ง€ ์ฐธ๊ณ . ๋ฌธ์ œํ’€๋Ÿฌ๊ฐ€๊ธฐ

๐Ÿ”‘ ๋ฌธ์ œ ํ’€์ด

์ค‘์š”!!! ํ•„์š”ํ•œ ์ผ ์ˆ˜์ด๋‹ค. ์ด๋™ํ•œ ํšŸ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ๋™์ผํ•œ ๋‚ ์— ์—ฐํ•ฉ์ด ์—ฌ๋Ÿฌ๊ฐœ ๋ฐœ์ƒํ•œ๋‹ค ํ•ด๋„ ํ•˜๋ฃจ์— ์ผ์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” 1์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค

๊ฐ ์นธ๋ณ„๋กœ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ.

๐Ÿฅฝ ์†Œ์Šค์ฝ”๋“œ ๋ฐ ์†Œ์Šคํ•ด์„

๋ฐฑ์ค€ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹Œ, visual studio ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ฝ”๋“œ์—๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;
struct Point {
	int x;
	int y;
};

vector<vector<Point>> group;
vector<vector<int>> myBoard;
vector<vector<bool>> checked;

void dfs(int pre, int x, int y, int low, int high, vector<vector<int>>& myBoard, vector<vector<bool>> &checked);
void flatting(vector<vector<int>>& myBoard);
int main() {

	int boardSize;
	cin >> boardSize;
	int low, high;
	cin >> low >> high;
	myBoard.assign(boardSize, vector<int>(boardSize,0));

	for (int i = 0; i < boardSize; i++)
		for (int j = 0; j < boardSize; j++)
			cin >> myBoard[i][j];

	int answer = 0;
	while (true) {
		group.clear();
		checked.clear();
		group.push_back(vector<Point>(0));
		checked.assign(boardSize, vector<bool>(boardSize, false));
		for (int i = 0; i < boardSize; i++)
		{
			for (int j = 0; j < boardSize; j++)
			{
				if (checked[i][j] == true) continue;
				dfs(myBoard[i][j], j + 1, i, low, high, myBoard, checked);
				dfs(myBoard[i][j], j - 1, i, low, high, myBoard, checked);
				dfs(myBoard[i][j], j, i + 1, low, high, myBoard, checked);
				dfs(myBoard[i][j], j, i - 1, low, high, myBoard, checked);
				if (group[group.size() - 1].size() != 0)
					group.push_back(vector<Point>(0));
			}
		}
		flatting(myBoard);
		if (group[0].size() == 0) break;
		answer++;
	}
	cout << answer;
}
void dfs(int pre, int x, int y, int low, int high, vector<vector<int>>& myBoard, vector<vector<bool>> &checked) {
	if (y < 0 || y >= myBoard.size() || x < 0 || x >= myBoard.size()) return;
	if (checked[y][x] == true) return;

	int diff = abs(myBoard[y][x] - pre);
	if (diff >= low && diff <= high) {
		checked[y][x] = true;
		group[group.size() - 1].push_back({ x,y });
		dfs(myBoard[y][x], x + 1, y, low, high, myBoard, checked);
		dfs(myBoard[y][x], x - 1, y, low, high, myBoard, checked);
		dfs(myBoard[y][x], x, y + 1, low, high, myBoard, checked);
		dfs(myBoard[y][x], x, y - 1, low, high, myBoard, checked);
	}
}
void flatting(vector<vector<int>>& myBoard) {
	for (int i = 0; i < group.size(); i++)
	{
		if (group[i].size() == 0) continue;
		int flat = 0;
		for (int j = 0; j < group[i].size(); j++)
			flat += myBoard[group[i][j].y][group[i][j].x];
		flat /= group[i].size();
		for (int j = 0; j < group[i].size(); j++)
			myBoard[group[i][j].y][group[i][j].x] = flat;
	}
}

๐Ÿ”จ ๋ฌธ์ œ ํ›„๊ธฐ

๋ถˆํ•„์š”ํ•œ ๋™์ž‘๋„ ๋งŽ์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ’€์—ˆ๋‹ค๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜๋‹ค. ์—ญ์‹œ ์„ธ์ƒ์—๋Š” ์ฒœ์žฌ๋Š” ๋งŽ๊ณ  ๋‚˜๋Š” ๋ฐ”๋ณด๋‹ค.

profile
I am two cat's father

0๊ฐœ์˜ ๋Œ“๊ธ€