[Baekjoon] 1343번 폴리오미노

Updated:

문제

민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

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

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

입력

첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 500이다.

출력

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

예제

Example 1:

Input: 
XXXXXX
Output: 
AAAABB

Example 2:

Input:
XX.XX
Output:
BB.BB

Example 3:

Input:
XXXX....XXX.....XX
Output:
-1

Example 4:

Input:
X
Output:
-1

Example 5:

Input:
XX.XXXXXXXXXX..XXXXXXXX...XXXXXX
Output:
BB.AAAAAAAABB..AAAAAAAA...AAAABB

조건

시간 제한 : 2초

메모리 제한 : 128 MB

풀이과정

풀이

s = str(input().rstrip())
ans = ""
# -1나올 경우
fine = 0
count = 0
for i in s:
  if i == ".":
    if count%2 == 1:
      fine = 1
      break
    else:
      while(count >= 4):
        ans += "AAAA"
        count -= 4
      if count == 2:
        count -= 2
        ans += "BB"
    count = 0
    ans += "."
  else:
    count+=1

#마지막
if count %2 == 1:
  fine = 1
else: 
  while(count >= 4):
    ans += "AAAA"
    count -= 4
  if count == 2:
    count -= 2
    ans += "BB"

if fine == 0:
  print(ans)
elif fine == 1:
  print("-1")

스트링에서 .이 아닌 경우면 X의 수를 count한다. .이라면 count한 수가 홀수면 fine을 1로 주어서 -1이 프린트되도록 하고 짝수라면 AAAA가 가능하면 먼저오도록(사전순) 조건에 맞게 ans에 추가해준다. 그리고 마지막으로 .을 추가해준다.

한편 .일때만 count한것을 반영하기 때문에 마지막 부분이 반영되지 않으므로 마지막부분을 추가해준다.

Leave a comment