BOJ 1343 (폴리오미노)

JH·2023년 2월 15일
0

BOJ 알고리즘 (C++)

목록 보기
29/97
  • 문제
    민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

    이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.

    폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.

  • 입력
    첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.

  • 출력
    첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.

#include<iostream>
#include<string>
using namespace std;
string s, answer;
void fast_io()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
}

int main()
{
	fast_io();
	getline(cin, s); int cnt = 0;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == 'X')
		{
			cnt++;
		}
		if (s[i] == '.')
		{
			answer += '.';
			if (cnt % 2 != 0)
			{
				break;
			}
			else
			{
				cnt = 0;
			}
		}

		if (cnt == 2 && s[i + 1] != 'X')
		{
			answer += "BB";
			cnt = 0;
		}
		else if (cnt == 4)
		{
			answer += "AAAA";
			cnt = 0;
		}
	}
	if (cnt % 2 != 0) cout << "-1";
	else cout << answer;
}

  'X'가 4개일때는 'AAAA' 2개일때는 'BB'를 넣어줘야한다 X가 연달아 4개 이상 나오는 경우에는 AAAA를 앞쪽부터 채워줘야 사전 순서대로 들어가게 된다. . 앞에 'X'의 갯수가 홀수가 나오는 경우는 바로 반복문을 빠져나간 후 마지막 출력 전에 1번 더 홀,짝 여부를 점검 후 결과를 출력하면 된다.

숏 코딩 버전 (정규식을 이용하여 문자열을 치환하는 방법)

#include<iostream>
#include<string>
#include<regex>
using namespace std;
string s, answer;
void fast_io()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
}

int main()
{
	fast_io();
	getline(cin, s);
	s = regex_replace(s, regex("XXXX"), "AAAA");
	s = regex_replace(s, regex("XX"), "BB");

	if (s.find("X") != -1)
	{
		cout << "-1";
	}
	else
	{
		cout << s;
	}
}

  string의 find 함수와 regex를 이용한 풀이이다
(이 풀이는 공부를 안했다면 절대 접근 못했을 것 같다)

profile
블로그 -> 노션

0개의 댓글