2020-12-30
문제
민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 500이다.
출력
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
import java.util.Scanner;
public class TemplateA {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String a = "AAAA";
String b = "BB";
String input = scan.next();
String [] arr = new String [500];
//변환된 값(a, b)이 들어갈 배열
int [] temp = new int [500];
//인트 값으로 변환된 input 값이 들어갈 배열
for(int i = 0; i < input.length(); i++) {
temp[i] = input.charAt(i) - 'W';
//X 의 자리에 모두 정수 1이 들어가게 변환
}
int count = 0;
//연속된 X 를 셀 변수
int num = 0;
//배열 위치 지정변수
boolean flag = true;
//덮을 수 없을 경우 체크 변수
for(int i = 0; i < input.length(); i++) {
if(temp[i] == 1) {
count++;
if(count % 4 == 0) {
arr[num] = a;
num++;
count = 0;
//4로 나누어지면 a 로 변환
}else if(count % 4 != 0 && count % 2 == 0 && temp[i + 1] != 1) {
arr[num] = b;
num++;
count = 0;
//4로 나누어지지 않으면서 2로는 나누어지면 배열의 다음 값이 1이 아닌 값
//즉 연속된 X값이 배열 다음자리에 없으면 이로 나누고 b로 덮어버림
}
}else {
if(count % 2 != 0) {
flag = false;
break;
//연속 값이 2로 안나누어지면 덮을 수 없음
//더이상 비교불필요 반복문 종료
}else {
arr[num] = ".";
num++;
//아니면 배열의 값을 점으로 채우고
//배열위치 하나씩 더해줌
}
}
}
if(flag == false || count == 1) {
System.out.println(-1);
//flag 그 여부와 주어진 값이 한자리면 -1 출력
}else {
for(int i = 0; i < num; i++) {
System.out.print(arr[i]);
}
}
}
}
출처링크 : www.acmicpc.net/problem/1343