래원

[LeetCode] 1861. Rotating the Box - Python 본문

알고리즘/LeetCode

[LeetCode] 1861. Rotating the Box - Python

Laewon Jeong 2024. 11. 23. 16:36

 

문제 설명


You are given an m x n matrix of characters box representing a side-view of a box. Each cell of the box is one of the following:

  • A stone '#'
  • A stationary obstacle '*'
  • Empty '.'

The box is rotated 90 degrees clockwise, causing some of the stones to fall due to gravity. Each stone falls down until it lands on an obstacle, another stone, or the bottom of the box. Gravity does not affect the obstacles' positions, and the inertia from the box's rotation does not affect the stones' horizontal positions.

It is guaranteed that each stone in box rests on an obstacle, another stone, or the bottom of the box.

Return an n x m matrix representing the box after the rotation described above.

 

문제 예제


Example 1:

 

Input: box = [["#",".","#"]]
Output: [["."],
         ["#"],
         ["#"]]

 

Example 2:

 

Input: box = [["#",".","*","."],
              ["#","#","*","."]]
Output: [["#","."],
         ["#","#"],
         ["*","*"],
         [".","."]]

 

Example 3:

Input: box = [["#","#","*",".","*","."],
              ["#","#","#","*",".","."],
              ["#","#","#",".","#","."]]
Output: [[".","#","#"],
         [".","#","#"],
         ["#","#","*"],
         ["#","*","."],
         ["#",".","*"],
         ["#",".","."]]

 

제한 사항


  • m == box.length
  • n == box[i].length
  • 1 <= m, n <= 500
  • box[i][j] is either '#', '*', or '.'.

 

✏️ Solution(솔루션)


class Solution:
    def rotateTheBox(self, box: List[List[str]]) -> List[List[str]]:
        temp_box = []

        for b in box:
            split_obstacle = []
            temp = deque()
            for c in b:
                if c == '*':
                    split_obstacle.append(temp)
                    temp = deque()
                    continue
                temp.append(c)
            split_obstacle.append(temp)

            for so in split_obstacle:
                empty_cnt = 0
                while '.' in so:
                    so.remove('.')
                    empty_cnt += 1
                for _ in range(empty_cnt):
                    so.appendleft('.')

            temp = ''
            for so in split_obstacle:
                temp += ''.join(so)
                temp += '*'
            
            temp_box.append(list(temp))
        
        n = len(box)
        m = len(box[0])
        rotate_box = [[] for _ in range(m)]

        for i in range(m):
            for j in range(n-1, -1, -1):
                rotate_box[i].append(temp_box[j][i])
        
        return rotate_box

 

최근에 푼 프로그래머스의 프렌즈4블록과 비슷한 느낌의 문제인 것 같아서 금방 풀 수 있었다.

 

먼저 box 각 행을 '*'을 기준으로 나눠주고 나눠준 리스트에서 모든 '.'을 제거해주었다.

그후 제거한 '.' 수 만큼 다시 appendleft 함수를 통해 리스트 왼쪽에 '.'을 추가해주었다.

 

이렇게 하면 90도로 돌렸을 때, stone('#')이 밑으로 떨어지는 것 처럼 구현할 수 있다.

 

그리고 '*'을 기준으로 나눈 리스트들을 다시 합쳐주고, output 형식에 맞게 결과를 return하여 정답을 맞출 수 있었다.

 

다른 사람들의 풀이를 보니 Two Pointer 알고리즘으로 푸는 문제 같았다.

문제를 좀 돌아서 푼 느낌이 있는 것 같다..


[LeetCode] 1861. Rotating the Box - Python