작심삼일

[LeetCode] 838 | Push Dominoes | Python 본문

스터디/코테

[LeetCode] 838 | Push Dominoes | Python

yun_s 2022. 9. 27. 10:44
728x90
반응형

문제 링크: https://leetcode.com/problems/push-dominoes/


문제

There are n dominoes in a line, and we place each domino vertically upright. In the beginning, we simultaneously push some of the dominoes either to the left or to the right.

After each second, each domino that is falling to the left pushes the adjacent domino on the left. Similarly, the dominoes falling to the right push their adjacent dominoes standing on the right.

When a vertical domino has dominoes falling on it from both sides, it stays still due to the balance of the forces.

For the purposes of this question, we will consider that a falling domino expends no additional force to a falling or already fallen domino.

You are given a string dominoes representing the initial state where:

  • dominoes[i] = 'L', if the $i^{th}$ domino has been pushed to the left,
  • dominoes[i] = 'R', if the $i^{th}$ domino has been pushed to the right, and
  • dominoes[i] = '.', if the $i^{th}$ domino has not been pushed.

Return a string representing the final state.


조건

  • n == dominoes.length
  • 1 <= n <= $10^5$
  • dominoes[i] is either 'L', 'R', or '.'.

내 풀이

domino를 순서대로 훑으며 현재 도미노가 '.'일 때는 '.'의 갯수를 센다.

 

만약 현재 도미노가 L 이라면 왼쪽으로 쓰러뜨린다는 뜻이기 때문에 이전 도미노의 마지막에 따라 다르게 행동한다.

이전 도미노의 마지막이 L 이라면 거기서부터 이 도미노까지 왼쪽으로 쓰러지기 때문에 현재까지 '.'의 수 만큼 L을 ans에 붙인다.

이전 도미노의 마지막이 R이라면 가운데를 중심으로 왼쪽 도미노들은 R, 오른쪽 도미노들은 L로 된다.

 

현재 도미노가 R 이라면 오른쪽으로 쓰러뜨린다는 뜻이기 때문에 이전 도미노의 마지막에 따라 다르게 행동한다.

이전 도미노의 마지막이 L 이라면 L과 R 사이의 도미노들은 건드리지 않기 때문에 현재까지 '.'의 수 만큼 '.'을 붙인다.

이전 도미노의 마지막이 R이라면 모두 오른쪽으로 쓰러지기 때문에 현재까지 '.'의 수 만큼 'R'을 붙인다.


코드

class Solution:
    def pushDominoes(self, dominoes: str) -> str:
        ans = []
        count = 0
        
        for domino in dominoes:
            if domino == '.':
                count += 1
                continue
                
            elif domino == 'L':
                if not ans or ans[-1] == 'L':
                    ans += ['L'*count]
                elif ans and ans[-1] == 'R':
                    ans += ['R'*(count//2) + ('.' if count%2!=0 else '') + 'L'*(count//2)]
            
            elif domino == 'R':
                if ans and ans[-1] == 'R':
                    ans += ['R'*count]
                elif not ans or (ans and ans[-1] == 'L'):
                    ans += ['.'*count]
            
            ans.append(domino)
            count = 0
        
        if ans and ans[-1] == 'R':
            ans += ['R'*count]
        if (ans and ans[-1] == 'L') or not ans:
            ans += ['.'*count]
        
        return ''.join(ans)
728x90
반응형
Comments