일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Hadoop
- 티스토리챌린지
- 딕셔너리
- leetcode
- 우선순위큐
- HDFS
- 파이썬
- 아파치 스파크
- 빅데이터
- Apache Spark
- 아파치 하둡
- 알고리즘
- Spark
- heapq
- Python
- 분산처리
- 하둡
- 코딩테스트
- programmers
- Data Engineering
- 분산
- 도커
- 스파크
- 이진탐색
- 리트코드
- Apache Hadoop
- docker
- 데이터 엔지니어링
- 프로그래머스
- 오블완
- Today
- Total
래원
[LeetCode] 1861. Rotating the Box - Python 본문
문제 설명
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' 카테고리의 다른 글
[LeetCode] 2924. Find Champion II - Python (0) | 2024.11.27 |
---|---|
[LeetCode] 773. Sliding Puzzle - Python (0) | 2024.11.25 |
[LeetCode] 2257. Count Unguarded Cells in the Grid - Python (0) | 2024.11.21 |
[LeetCode] 2461. Maximum Sum of Distinct Subarrays With Length K - Python (0) | 2024.11.19 |
[LeetCode] 1652. Defuse the Bomb - Python (0) | 2024.11.18 |