- 문제
민식이는 다음과 같은 폴리오미노 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를 이용한 풀이이다
(이 풀이는 공부를 안했다면 절대 접근 못했을 것 같다)