[백준/BOJ] 백준 15999번 : 뒤집기

2021. 3. 25. 13:55알고리즘 문제풀이

www.acmicpc.net/problem/15999

 

15999번: 뒤집기

첫 줄에 격자의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 출력한다.

www.acmicpc.net

4방향에 해당 위치 색깔과 다른 색깔이 있으면 해당 위치 색깔은 원본 색깔과 같다는 것을 이용해서 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <string>
#include <cmath>
using namespace std;

int n, m;
vector<string> board;
int dxdy[4][2] = { {0,-1},{-1,0},{0,1},{1,0} };

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		string input;
		cin >> input;

		board.push_back(input);
	}

	long long cnt = 0;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			pair<int, int> here = make_pair(i, j);
			bool original = false;

			for (int dir = 0; dir < 4; dir++)
			{
				pair<int, int> there = make_pair(here.first + dxdy[dir][0], here.second + dxdy[dir][1]);

				if (there.first >= 0 && there.first < n && there.second >= 0 && there.second < m)
				{
					//4방향에 다른 색깔이 있으면 원본 색깔과 같다는게 확인된다
					if (board[there.first][there.second] != board[here.first][here.second])
					{
						original = true;
						break;
					}


				}
			}

			if (original == false)
				cnt++;
		}

	long long result = 1;
	for (long long i = 1; i <= cnt; i++)
		result = (((result * 2) + 1000000007) % 1000000007);

	cout << result;


	return 0;
}