Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 피보나치 함수
- Max Array Sum
- hackerrank
- 머신러닝
- Algorithm
- 프로그래머스
- Find the nearest clone
- Common Child
- 파이썬
- candies
- BFS: Shortest Reach in a Graph
- 격파르타 후기
- 코딩테스트
- 야근지수
- Interview Preparation Kit
- 격파르타 장점
- 격파르타 합격후기
- [sqld]자격증합격
- Recursion: Davis' Staircase
- Roads and Libraries
- Special String Again
- programmers
- DFS: Connected Cell in a Grid
- python
- Reverse Shuffle Merge
- 알고리즘
- 백준
- 해커랭크
- 구슬탈출2
- 매칭점수
Archives
- Today
- Total
Archive
[Hackerrank] [Hard] DFS: Connected Cell in a Grid 본문
https://www.hackerrank.com/challenges/ctci-connected-cell-in-a-grid/problem
풀이
- 0과 1로 구성된 grid가 주어지면, 1을 기준으로 한 영역의 최댓값을 구하는 문제.
- 8가지 방향에 1이 있으면 같은 영역이라 가정.(왼쪽 대각선 위부터 시계방향)
- visited를 확인하기 위한 matrix 만들고, 방향 정보 리스트 만들고, stack을 사용해 dfs 구현하면 됨.
def maxRegion(grid):
n = len(grid)
m = len(grid[0])
ans = []
visited = [[0 for _ in range(m)] for _ in range(n)]
# 다음 좌표 방향을 저장한 리스트.
# 왼쪽 대각선 위로부터해서 시계방향으로 순회.
di = [-1, -1, -1, 0, 1, 1, 1, 0 ]
dj = [-1, 0, 1, 1, 1, 0, -1, 1 ]
for i in range(n):
for j in range(m):
# grid 값이 1이고, 아직 방문하지 않은 위치임.
if grid[i][j] == 1 and visited[i][j] == 0:
stack = [(i, j)]
visited[i][j] = 1
cnt = 1
while stack:
ii, jj = stack.pop()
for dir in range(8):
next_i = ii + di[dir]
next_j = jj + dj[dir]
if 0 <= next_i < n and 0 <= next_j < m and \
grid[next_i][next_j] and visited[next_i][next_j] == 0:
stack.append((next_i, next_j))
# stack에 추가할 때 visited를 1로 바꿔줘야 나중에 방문한 곳을 stack에 중복해서 넣지 않음.
visited[next_i][next_j] = 1
cnt += 1
ans.append(cnt)
return max(ans)
Comments