
map[y][x] 로 접근한다.(x, y)[row][col]map[y][x] 로 저장/조회map[y][x]만 일관되게 쓰면 큰 문제 없음자주 하는 실수
- (x, y)를 습관적으로
map[x][y]에 넣음- 입력이 1-based 인데 0-based로 바로 사용 (필요 시
x-1,y-1)
전체 탐색/연결 요소 개수: DFS, BFS 모두 가능
도달 가능 여부만 확인: 둘 다 가능 (그래프 형태에 따라 선택)
최단 거리(비가중 그래프): BFS (레벨 = 거리)
단계별 상태 확장/시뮬레이션: BFS (레벨이 1씩 증가)
모든 경로/조합 열거, 백트래킹: DFS (가지치기 용이, 메모리 절약)
메모리 관점:
| 목적/상황 | 추천 |
|---|---|
| 최단 거리(가중치 동일/없음) | BFS |
| 레벨별 상태 확인(시뮬·퍼즐 단계 확장) | BFS |
| 모든 경로/조합·백트래킹 | DFS |
| 단순 도달성 | DFS/BFS 모두 |
| 메모리 제한(깊고 좁은 그래프) | DFS (반복/스택 권장) |
Queue<int[]> q = new ArrayDeque<>();
boolean[][] vis = new boolean[N][M];
q.offer(new int[]{sy, sx});
vis[sy][sx] = true;
int dist = 0;
while (!q.isEmpty()) {
int sz = q.size(); // 레벨(거리) 한 층
while (sz-- > 0) {
int[] cur = q.poll();
int y = cur[0], x = cur[1];
// 목표 검사/처리 ...
for (int d = 0; d < 4; d++) {
int ny = y + dy[d], nx = x + dx[d];
if (ny<0 || nx<0 || ny>=N || nx>=M) continue;
if (vis[ny][nx] || wall[ny][nx]) continue;
vis[ny][nx] = true;
q.offer(new int[]{ny, nx});
}
}
dist++; // 레벨 증가 ⇒ 최단거리 +1
}
boolean[][] vis = new boolean[N][M];
void dfs(int y, int x) {
vis[y][x] = true;
// 처리 로직 ...
for (int d = 0; d < 4; d++) {
int ny = y + dy[d], nx = x + dx[d];
if (ny<0 || nx<0 || ny>=N || nx>=M) continue;
if (vis[ny][nx] || wall[ny][nx]) continue;
dfs(ny, nx);
}
// 필요 시 백트래킹: vis[y][x] = false;
}
map[y][x] 로 일관성 유지x-1, y-1)