민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
입력 | 출력 |
---|---|
XXXXXX | AAAABB |
XX.XX | BB.BB |
XXXX....XXX.....XX | -1 |
X | -1 |
XX.XXXXXXXXXX..XXXXXXXX...XXXXXX | BB.AAAAAAAABB..AAAAAAAA...AAAABB |
이 문제는 연속된 X의 개수를 체크하며 보드판을 만들어나가면 된다. 다만 문제에 제시된 것처럼
폴리오미노를 사전 순으로 덮아야 한다는 조건을 지켜야 한다.
'X'가 나왔을 경우에는 '.'이 나오거나 종료될 때까지 X의 개수를 체크한다.
'.'이 나왔을 때는 'X'의 개수가 0일 경우와 0이상일 경우 2가지로 나눠서 진행한다.
if (0 이상일 경우):
'X'의 개수를 4로 나눈 몫만큼 A를 보드판에 추가 # A로 덮을 수 있는 개수
if ('X'의 개수를 4로 나눈 나머지가 2나 0이 아닐 경우):
폴리오미노로 다 덮을 수 없는 문자열이므로 -1을 출력
else:
나머지만큼 B를 보드판에 추가 # 2면 B로 한번 덮을 수 있고, 0이면 B로 덮을 것이 없음
else:
'.'을 보드판에 추가
이 풀이의 시간 복잡도는 O(N)이고 보드판의 최대 길이가 50이므로 풀이가 가능하다.
코드를 작성하고 나서 발생한 2가지 이슈는 사소한 부분들인데, 문제를 풀이하는데 정신이 팔려 놓치고 말았다. 수도 코드를 작성해보며 생각하지 못한 엣지 케이스가 존재하는지 확인해 볼 필요가 있다.