일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 오블완
- HDFS
- 스파크
- 딕셔너리
- 아파치 하둡
- 코딩테스트
- 파이썬
- 도커
- 알고리즘
- Spark
- 티스토리챌린지
- docker
- 빅데이터
- 분산
- 이진탐색
- 리트코드
- Python
- 분산처리
- Hadoop
- programmers
- 프로그래머스
- Apache Spark
- Data Engineering
- 하둡
- 데이터 엔지니어링
- heapq
- leetcode
- 우선순위큐
- Apache Hadoop
- 아파치 스파크
- Today
- Total
래원
[LeetCode] 2257. Count Unguarded Cells in the Grid - Python 본문
[LeetCode] 2257. Count Unguarded Cells in the Grid - Python
Laewon Jeong 2024. 11. 21. 17:29
난이도: Medium
문제 설명
You are given two integers m and n representing a 0-indexed m x n grid. You are also given two 2D integer arrays guards and walls where guards[i] = [rowi, coli] and walls[j] = [rowj, colj] represent the positions of the ith guard and jth wall respectively.
A guard can see every cell in the four cardinal directions (north, east, south, or west) starting from their position unless obstructed by a wall or another guard. A cell is guarded if there is at least one guard that can see it.
Return the number of unoccupied cells that are not guarded.
문제 예제
Example 1:
Input: m = 4, n = 6, guards = [[0,0],[1,1],[2,3]], walls = [[0,1],[2,2],[1,4]]
Output: 7
Explanation: The guarded and unguarded cells are shown in red and green respectively in the above diagram.
There are a total of 7 unguarded cells, so we return 7.
Example 2:
Input: m = 3, n = 3, guards = [[1,1]], walls = [[0,1],[1,0],[2,1],[1,2]]
Output: 4
Explanation: The unguarded cells are shown in green in the above diagram.
There are a total of 4 unguarded cells, so we return 4.
제한 사항
- 1 <= m, n <= 105
- 2 <= m * n <= 105
- 1 <= guards.length, walls.length <= 5 * 104
- 2 <= guards.length + walls.length <= m * n
- guards[i].length == walls[j].length == 2
- 0 <= rowi, rowj < m
- 0 <= coli, colj < n
- All the positions in guards and walls are unique.
솔루션(Solution)
class Solution:
def countUnguarded(self, m: int, n: int, guards: List[List[int]], walls: List[List[int]]) -> int:
board = [[0] * n for _ in range(m)]
for i, j in guards:
board[i][j] = 'G'
for i, j in walls:
board[i][j] = 'W'
moves = [[1,0], [0,1],[-1,0],[0,-1]]
for i, j in guards:
for move in moves:
x, y = i, j
while True:
x += move[0]
y += move[1]
if 0<=x<m and 0<=y<n and (board[x][y] == 0 or board[x][y] == -1):
board[x][y] = -1
else:
break
answer = 0
for i in range(m):
for j in range(n):
if board[i][j] == 0:
answer += 1
return answer
이 문제는 단순히 문제에 나와있는 내용을 그대로 구현하면 되는 문제였다.
이 문제를 해결하기 위해 일단 board를 만들어 주어진 m, n에 맞게 0으로 채워주었다.
그후 가드에 위치에는 'G', 벽의 위치에는 'W'를 넣어주었다.
이제 'G'를 기준으로 상하좌우로 쭉 이동해 조건에 맞으면 그 위치를 -1로 바꿔주었고, 조건에 맞지 않으면 break 문을 통해 다른 위치를 업데이트 해주었다.
모든 연산이 끝나면, 마지막에 board에서 0을 가지는 위치를 count해서 정답으로 반환하면 되었다.
처음에는 dfs를 써서 풀어야하는 문제인가 했는데, 단순히 문제 그대로 구현만 하면 될 것 같아서 이렇게 풀었던 것 같다.
딱히 어렵지는 않은 문제였다.
'알고리즘 > LeetCode' 카테고리의 다른 글
[LeetCode] 773. Sliding Puzzle - Python (0) | 2024.11.25 |
---|---|
[LeetCode] 1861. Rotating the Box - Python (0) | 2024.11.23 |
[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 |
[LeetCode] 2064. Minimized Maximum of Products Distributed to Any Store - Python (1) | 2024.11.14 |