Cherry & Cherish

[Python3] 백준(Baekjoon) 폴리오미노 1343 본문

Algorithm/Baekjoon

[Python3] 백준(Baekjoon) 폴리오미노 1343

앵도라지 2023. 1. 27. 14:42

문제 :

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

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

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

접근 :

최대한 문제 그대로 단순무식하게 풀이하려고 했다.

while문 안에서 X가 나왔을 때는 연달아 나오는 X의 개수를 세서 그 개수가 4의 배수일 때는 'AAAA'를 누적하고, 2의 배수일 때는 4로 나눈 몫 만큼 'AAAA'를 곱해서 누적한뒤에 'BB'를 누적한다. 그리고 arr을 삭제해버린다. arr이 모두 없어지거나, 4의 배수도, 2의 배수도 아닐 때는 바로 -1를 입력해 while 문 자체가 끝나게 한다.

 

다시 푼다면, 입력을 '.'을 기준으로 str을 나눠서, 'XXXXXX'가 리스트의 한 객체가 되도록 푸는 것이 훨씬 효율적일 것 같다.

초반 입력을 너무 꼬아서 받은 것 같다.

풀이 :

arr=list(map(str, input()))
ans = ''
while arr and ans != '-1':
    if arr[0] == 'X':
        temp = 0
        for i in range(len(arr)):
            if arr[i] == 'X':
                temp += 1
            elif arr[i] == '.':
                break
        if temp % 4 == 0 :
            now = temp // 4
            ans += ('AAAA' * now)
        elif temp % 4 == 2:
            now = temp // 4
            if now != 0 :
                ans += ('AAAA'*now)
                ans += 'BB'
            else :
                ans += 'BB'
        else :
            ans = '-1'
            break
        del arr[:temp]
    elif arr[0] == '.':
        ans += arr[0]
        arr.pop(0)

print(ans)

 

다른 풀이를 참고해보니, replace를 사용하면 정말 간단하게 풀 수 있다.

board = input()

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

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