코딩
[코딩테스트] DFS 와 BFS 정리
obin01
2024. 12. 28. 03:42
1. DFS
✅ DFS
깊이 우선 탐색
- 스택 자료구조 또는 재귀함수를 이용
2. BFS
✅ BFS
너비 우선 탐색
- 큐 자료구조 이용
3. 문제
https://school.programmers.co.kr/learn/courses/30/parts/12421
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1) 타겟넘버
정답 )
더보기
// DFS를 이용
class Solution {
int answer = 0;
public int solution(int[] numbers, int target) {
// 조건에 해당하는 재귀함수를 호출 (-/+)
dfs(-1 * numbers[0], 1, numbers, target);
dfs(numbers[0], 1, numbers, target);
return answer;
}
// 재귀함수
public void dfs(int num, int cnt, int[] numbers, int target) {
// 종료 조건
if(cnt == numbers.length){
// 타겟넘버 확인
if(num == target){
answer++;
}
return;
}
// 종료조건에 해당할때 까지 반복 (-/+)
dfs(num - numbers[cnt], cnt+1, numbers, target);
dfs(num + numbers[cnt], cnt+1, numbers, target);
}
}
2) 게임 맵 최단거리
정답 )
더보기
// BFS를 이용
import java.util.*;
class Solution {
public int solution(int[][] maps) {
int rowLen = maps.length; // 행 최대길이
int colLen = maps[0].length; // 열 최대길이
int[][] visited = new int[rowLen][colLen]; // 방문한 지역
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[2]);
visited[0][0] = 1; // 시작점 (0,0)
while(!queue.isEmpty()){
int[] pos = queue.poll(); // 큐에서 먼저들어가있는 값 제거하면서 반환
int row = pos[0];
int col = pos[1];
if(row == rowLen -1 && col == colLen -1){
// 도착 지점
return visited[row][col];
}
int cnt = -1;
for(int i=0; i<4; i++){
// 상,하,좌,우 네번 이동가능
int rowMove = pos[0] + (i%2 == 0 ? cnt : 0);
int colMove = pos[1] + (i%2 > 0 ? cnt : 0);
// 이동 불가
if(0 <= rowMove && rowMove < rowLen && 0 <= colMove && colMove < colLen) {
// 이미 방문했거나 벽에 막혔을때
if(maps[rowMove][colMove] != 0 && visited[rowMove][colMove] == 0){
// 큐 추가
queue.offer(new int[]{rowMove, colMove});
// 방문 지역에 최단 거리 값 추가
visited[rowMove][colMove] = visited[row][col] + 1;
}
}
if(i == 1) cnt *= -1;
}
}
// 도착 불가
return -1;
}
}