일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JPA스터디
- nestjs공부
- JPA예제
- Axon framework
- 기술면접공부
- 스프링부트공부
- K8S
- 플러터 개발
- 코테준비
- 알고리즘공부
- Kafka
- JPA 공부
- 프로그래머스
- 카프카
- querydsl
- nestjs
- 스프링 공부
- Flutter
- 기술공부
- 스프링
- 코테공부
- JPA
- nestjs스터디
- 플러터 공부
- DDD
- 스프링부트
- 스프링공부
- 자료구조공부
- 자바공부
- JPA공부
- Today
- Total
DevBoi
DFS 관련 개념 정리 본문
BFS, DFS 는 알고리즘 유형에서 많이 나오는 유형이다.
우선 탐색 관련 된 내용이다.
스택 = pop,push로 선입 후추이다. 박스쌓기 처럼, 최상단 출력, peek()
큐 = 선입선출 , 줄서기, 대기열 같이, offer, poll 사용해서 사용
DFS : 깊이 우선 탐색, 스택 OR 재귀함수를
탐색 시작 노드 스택에 삽입, 인접 노드 스택에 넣고
개념을 익히기에 좋은 문제라고 생각한다.
우선, 해당 부분을 이해 및 풀을려면 어떤식으로 돌아가야하는지 알아야한다.
1은 false , 0은 true로 이해하면 된다.
자, 그러면 코딩을 해보자
import java.util.*;
public class HelloCodiva {
public static int n, m;
public static int[][] graph = new int[1000][1000];
// DFS로 특정 노드를 방문하고 연결된 모든 노드들도 방문
public static boolean dfs(int x, int y) {
// 주어진 범위를 벗어나는 경우에는 즉시 종료
if (x <= -1 || x >=n || y <= -1 || y >= m) {
return false;
}
// 현재 노드를 아직 방문하지 않았다면
if (graph[x][y] == 0) {
// 해당 노드 방문 처리
graph[x][y] = 1;
// 상, 하, 좌, 우의 위치들도 모두 재귀적으로 호출
dfs(x - 1, y);
dfs(x, y - 1);
dfs(x + 1, y);
dfs(x, y + 1);
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// N, M을 공백을 기준으로 구분하여 입력 받기
n = sc.nextInt();
m = sc.nextInt();
sc.nextLine(); // 버퍼 지우기
// 2차원 리스트의 맵 정보 입력 받기
for (int i = 0; i < n; i++) {
String str = sc.nextLine();
for (int j = 0; j < m; j++) {
graph[i][j] = str.charAt(j) - '0';
}
}
// 모든 노드(위치)에 대하여 음료수 채우기
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 현재 위치에서 DFS 수행
if (dfs(i, j)) {
result += 1;
}
}
}
System.out.println(result); // 정답 출력
}
}
해당 건 단순하다.
단순히 scanner로 받아서, 0인지 체크 맞으면 1로 변환, return true
count +1 만 해주면된다.
상하좌우에 대한 개념 2차원배열 개념만익히면 될듯하다.
쉽게 말하면, 재귀함수를 통해, 인접 한 -1,+1 을 해서, 해당을 식별할수있는 값으로 update를 치고,
해당 update 를 할수없으면, 본함수에서 for문으로 다음 인덱스를 탄다.
재귀함수를 호출했을때, 해당 재귀함수의 return 값은 중요하지않다. 마지막에 강제 return true를 주기 떄문에
'Algorithm > [Etc]' 카테고리의 다른 글
[자료구조] 선택정렬/삽입정렬/퀵정렬 개념 및 예제 코딩 (0) | 2021.07.05 |
---|---|
Stream 객체 api 관련 데이터 처리 공부 (0) | 2021.07.05 |
[그리디 구현 예제] (0) | 2021.07.02 |
[자료구조 공부] Hashset 사용하기 (0) | 2021.06.26 |
[프로그래머스] 전화번호부 (0) | 2021.05.17 |