a-080-number-of-islands2026-08-07mediumleetcode #200neetcode150
섬의 개수
#array#depth-first-search#breadth-first-search#union-find#matrix
01
문제
· problemm × n 크기의 2D 이진 그리드가 주어집니다. 이 그리드에서 '1'은 땅, '0'은 물을 나타냅니다. 섬의 개수를 반환하세요. 섬은 물로 둘러싸여 있으며 인접한 땅들이 수평 또는 수직으로 연결되어 있습니다. 그리드의 모든 네 모서리는 물로 둘러싸여 있다고 가정할 수 있습니다.
제약
- · 1 ≤ m, n ≤ 300
- · grid[i][j] ∈ {'0', '1'}
- · m == grid.length, n == grid[i].length
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
02
사전 사고
· pre-solve● 1리스트 출력→● 2선택→● 3정답 공개
- ☐인접한 셀은 무엇을 포함하나요?
- ☐입력 그리드를 수정할 수 있나요?
- ☐null이거나 빈 그리드를 어떻게 처리하나요?
- ☐대각선으로 연결된 땅도 같은 섬으로 계산하나요?
- ☐물(0)의 개수를 세어야 하나요?
던질 질문에 체크하고 확인을 누르세요
// 결과는 세션 메모리만 — 새로고침하면 초기화됩니다 (반복 학습)
03
논리 구조
· logic● 1슬롯 출력→● 2슬롯별 선택→● 3정답 공개
// 각 슬롯에 들어갈 코드 한 줄을 골라 알고리즘 흐름을 합성해보세요. 코드는 안 짜지만 논리 뼈대는 직접.
step 1· 엣지 케이스 확인
○
○
if len(grid) == 0: return 0
○
if grid is None: return -1
step 2· 자료 구조 초기화
○
○
islands = 1
○
visit = []
step 3· DFS 경계 및 상태 검사│ 중첩
○
○
if r < 0 or r >= rows or c < 0 or c >= cols: return
○
if grid[r][c] != '1': return
step 4· 방문 표시 및 4방향 탐색│ 중첩
○
○
visit.add((r, c)); dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1)
○
dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1); dfs(r, c - 1); visit.add((r, c))
step 5· 주 반복문: 미방문 땅 셀 찾기
○
○
if grid[r][c] == '1':
○
if (r, c) not in visit:
step 6· 섬 카운터 증가 및 DFS 호출│ 중첩
○
○
dfs(r, c); islands += 1
○
islands = islands + 1 + count_connected_cells(r, c)
step 7· 결과 반환
○
○
return len(visit)
○
return islands + 1
각 슬롯에 한 줄씩 골라보세요
// format: slot — 다른 패턴(재귀·DP 등) 은 ordering·state-first 등 별도 format. ADR-08 후속.
04
문제풀이 · 트레이스
· solve머릿속 dry-run 케이스
// 각 케이스를 머릿속으로 따라가보세요. 막히면 아래 worked example 펼침.
case 1
[["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]→
1
case 2
[["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]→
3
// UI 가 walk-through 안 함 — 학습자가 머릿속으로. 막히면 worked example 펼침.