Algorithm/백준
*[백준][1343] 폴리오미노
1일1코딩
2021. 5. 19. 23:33
https://www.acmicpc.net/problem/1343
1343번: 폴리오미노
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
www.acmicpc.net
문제
민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 500이다.
출력
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
해결 방법
1. 연속 된 X의 갯수를 체크하여 .이 나올 경우 또는 문자열의 끝인 경우에 바꿔치기를 시전하였다.
2. 연속된 X의 갯수가 홀수이면 보드판을 AAAA, BB로 덮을 수 없게 된다.
3. 가능 한 경우 AAAA에 우선순위를 높여 보드판을 덮도록 하였다.
소스코드
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
bool solution(string &answer, int &count)
{
while (count) {
if (count - 4 >= 0) {
answer += "AAAA";
count -= 4;
}
else if (count - 2 >= 0) {
answer += "BB";
count -= 2;
}
else {
return false;
}
}
return true;
}
int main()
{
string str;
string answer = "";
cin >> str;
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'X') {
count++;
}
else if (str[i] == '.') {
if (!solution(answer ,count)) {
printf("-1\n");
return 0;
}
answer += ".";
}
}
if (!solution(answer, count)) {
printf("-1\n");
return 0;
}
printf("%s\n", answer.c_str());
return 0;
}
결과