728x90
문제
1343번: 폴리오미노
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
www.acmicpc.net

풀이
import sys
input = sys.stdin.readline
boards = list(map(str, input().rstrip().split('.')))
ans = ''
for board in boards:
if board == '':
ans += '.'
else:
if len(board) % 2:
print(-1)
exit()
ans += 'AAAA' * (len(board) // 4) + 'B' * (len(board) % 4) + '.'
print(ans[:-1])
코드를 세세히 뜯어보겠습니다.
import sys
input = sys.stdin.readline
이러면 입력을 빠르게 받을 수 있습니다.
# 입력받은 문자열을, '.'을 기준으로 나누어 board에 저장합니다.
boards = list(map(str, input().rstrip().split('.')))
input 예시: .XX.XXXXXXXXXX..XXXXXXXX...XXXXXX.
boards = ['', 'XX', 'XXXXXXXXXX', '', 'XXXXXXXX', '', '', 'XXXXXX', '']
for board in boards: # boards 리스트에 있는 board를 하나씩 보겠습니다.
# board가 ''인 것은, input에 '.'가 존재했던 흔적이므로, ans에 '.'을 추가합니다.
if board == '':
ans += '.'
# board가 X로 이루어진 문자열이면,
else:
if len(board) % 2: # board를 구성하는 X가 홀수 개라면,
print(-1) # 정답을 출력할 수 없으므로 -1을 출럭하고 실행을 중단합니다.
exit()
# board를 구성하는 X가 짝수 개라면, 'AAAA'와 'BB'를 알맞게 추가하고
# 끝엔 '.'을 더해줍니다.
ans += 'AAAA' * (len(board) // 4) + 'B' * (len(board) % 4) + '.'
boards의 일부분인 [~ 'XX', 'XXXXXXXXXX' ~]이나 [~ 'XXXXXXXXXX', '', 'XXXXXXXX' ~]에서 보이는 것처럼, 문자열은 ‘.’을 기준으로 나누어졌기 때문에, ‘X로 구성된 문자열’이 끝나면 ‘.’를 추가해줘야 합니다.
print(ans[:-1])
마지막 ‘X로 구성된 문자열’ 이후엔 불필요한 ‘.’가 추가되므로, 제거하고 출력합니다.
728x90