본문 바로가기

백준

2024.9.10 백준(Python) 1343 폴리오미노

폴리오미노

 
 
 

문제

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

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

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

입력

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

출력

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

예제 입력 1 

XXXXXX

예제 출력 1 

AAAABB

예제 입력 2 

XX.XX

예제 출력 2 

BB.BB

예제 입력 3 

XXXX....XXX.....XX

예제 출력 3 

-1

예제 입력 4 

X

예제 출력 4 

-1

예제 입력 5 

XX.XXXXXXXXXX..XXXXXXXX...XXXXXX

예제 출력 5 

BB.AAAAAAAABB..AAAAAAAA...AAAABB

 

정답코드(replace를 알기 전..)

# 사용자로부터 입력을 받음
board = input()

# 입력받은 문자열을 '.'을 기준으로 분리하여 리스트로 만듦
board_list = list(board.split("."))

# 리스트의 길이를 구함
leng = len(board_list)

# 리스트를 역순으로 순회
for i in range(leng-1, -1, -1):
    if board_list[i] == '':  # 만약 요소가 빈 문자열이면, '.'으로 대체
        board_list[i] = '.'

# 리스트의 현재 위치를 추적하기 위한 인덱스 초기화
index = 0

# board_list의 각 요소를 순회
for i in board_list:
    if i == '.':  # 만약 요소가 '.'이면, 현재 반복을 건너뜀
        index += 1
        continue
    
    # 문자열의 길이가 홀수인 경우, 'AAAA' 또는 'BB'로 균등하게 나눌 수 없으므로 -1을 출력하고 종료
    if len(i) % 2 == 1:
        print(-1)
        exit()
    
    # 문자열의 길이가 4보다 크고 4로 나눴을 때 나머지가 2인 경우,
    # 'AAAA'로 채운 뒤 'BB'를 붙이고 '.'을 추가
    elif len(i) > 4 and len(i) % 4 == 2:
        board_list[index] = "AAAA" * (len(i) // 4) + "BB" + '.'
    
    # 문자열의 길이가 4로 나눠 떨어지는 경우, 'AAAA'로만 채우고 '.'을 추가
    elif len(i) % 4 == 0:
        board_list[index] = "AAAA" * (len(i) // 4) + '.'
    
    # 그 외의 경우, 2로 나눠 떨어지면 'BB'로 채우고 '.'을 추가
    else:
        board_list[index] = "BB" + '.'
    
    # 인덱스 증가
    index += 1

# 리스트를 다시 하나의 문자열로 합침
result = ''.join(board_list)

# 마지막 문자가 '.'이므로 그 문자를 제외하고 출력
print(result[0:len(result)-1])

 

코드2

board = input()

board = board.replace("XXXX", "AAAA")
board = board.replace("XX", "BB")

if 'X' in board:
    print(-1)
    
else:
    print(board)

코드의 가독성이 달라졌다