PushDominoes

Published at 2021-12-03

class Solution:
    def pushDominoes(self, dominoes: str) -> str:
        def updateDominoes(start, end):
            left, right = dominoes[start - 1], dominoes[min(length - 1, end + 1)]

            # 첫이거나 끝
            if start == 0:
                if right == 'L':
                    left = right  # 전부 쓰려뜨려야함
                elif right == 'R':
                    left = 'L'  # 쓰러뜨릴거 없으니까 밑에서 처리되게 left업뎃
            if end == length - 1:
                if left == 'R':
                    right = left
                elif left == 'L':
                    right = 'R'

            # 쓰러뜨릴게 없으면 걍 반환
            if left == 'L' and right == 'R': return dominoes[start:end + 1]

            # if start == 0: left = right  # 첫이거나 끝이면 어차피 한쪽으로 쓰러짐
            # if end == length-1: right = left

            tempList = list(dominoes[start:end + 1])
            i = -1
            for i in range((end - start + 1) // 2):
                tempList[i] = left
                tempList[-i - 1] = right
            if left == right:  # 가운데 처리
                tempList[i + 1] = left
            return ''.join(tempList)

        length = len(dominoes)
        start, end = 0, 0
        for i in range(length):
            dominoe = dominoes[i]
            if dominoe == '.' and dominoes[max(0, i - 1)] != '.':
                start = i
            if dominoe == '.' and dominoes[min(length - 1, i + 1)] != '.':
                end = i
                result = updateDominoes(start, end)
                dominoes = dominoes[:start] + result + dominoes[end + 1:]
        # 마지막 . 덩어리 처리
        if start > end:
            end = i
            result = updateDominoes(start, end)
            dominoes = dominoes[:start] + result + dominoes[end + 1:]
        return dominoes

# 연속되는 . 의 범위를 알아내서 걔네를 쓰러뜨릴거임
# 쓰러뜨릴때 반으로 나눠서 왼쪽은 왼쪽도미노의 상태, 오른쪽은 오른쪽도미노 상태로 만들면됨
#           (길이가 홀수면 가운데는 안쓰러지겠찌?) + 한쪽으로만 쓰러질경우는 가운데 남기면 안됨
#   ㄴ 여기서 왼쪽이나 오른쪽이 제일 끝일경우는 예외처리(끝이면 어차피 끝아닌쪽 방향으로 쓰러질거임)