폴리오미노(백준 1343번)
💡 **Check Point !
( 해당사항 ✓체크 )
막힘 없이 수월하게 풀린 문제인가? ✓
1시간이내로 풀렸던 문제인가?
1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
시간을 써도 도무지 풀 수 없는 문제인가?
솔루션을 찾아봤는가?
난이도 체감
최상
상
중
하✓
이해도
완벽히 이해✓
다소 헷갈리는 부분들이 있음
이해 못함
(예외 사항을 잘 생각해보고 코드를 짜야 할 것 같다.)
문제
민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 ‘.’와 ‘X’로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 ‘X’를 모두 폴리오미노로 덮으려고 한다. 이때, ‘.’는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
B=input()
count=0
answer=''
for i in range(len(B)):
if B[i]=='X':
count+=1
if i==len(B)-1 or B[i+1]=='.':
if count%2==1:
print(-1)
break
else:
for j in range(count//4):
answer+='AAAA'
for k in range((count%4)//2):
answer+='BB'
count=0
else:
answer+='.'
else:
if count==0:
print(answer)
else:
print(-1)
- 연속해서 나오는 X의 개수를 파악하고, 만약 X의 개수가 홀수라면 바로 -1을 출력하도록 코드를 짰다. 만약 짝수라면 출력 가능하기 때문에 조건에 따라 ‘AAAA’ 또는 ‘BB’를 문자열에 넣어주었다.
- 여기서 내가 한가지 간과했던 것은, 만약 ‘X.’이라는 보드판이 있다면, count의 값에 따라 제대로 처리되지 않은채 answer를 출력한다는 것이다.
개선한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
B=input()
count=0
answer=''
for i in range(len(B)):
if B[i]=='X':
count+=1
if i==len(B)-1 or B[i+1]=='.':
if count%2==1:
print(-1)
break
else:
for j in range(count//4):
answer+='AAAA'
for k in range((count%4)//2):
answer+='BB'
count=0
else:
answer+='.'
else:
print(answer)
- 생각해보니, count에 대한 예외가 아니라, break를 통해 for문을 나왔을 때, answer를 출력하지 않도록 하는 코드가 필요했다. 따라서 else를 추가한 것이 해결 방법이었다.
- 아무리 생각해도 count가 0이 아닌 경우가 없는 것 같아서 생각해보았고, 위 코드처럼 작성할 수 있다.
This post is licensed under CC BY 4.0 by the author.