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
- 프로그래머스
- 코틀린
- programmers
- 프로젝트
- 스프링
- Spring
- 네트워크
- Java8
- Brute-force
- 그래프
- 백준
- LEVEL2
- DFS
- back-end
- DP
- lambda
- 백트래킹
- 모던자바
- baekjoon
- TDD
- OS
- 자료구조
- 알고리즘
- algorithm
- backtracking
- java
- kotlin
- 운영체제
- 자바
- BFS
Archives
- Today
- Total
요깨비's LAB
[백준, Graph, JAVA] P.11403 경로찾기 본문
방향그래프인 것을 생각하고, DFS를 이용하여 해결하였습니다. 로직은 아래와 같이 생각했습니다.
-
행렬에 값을 넣을때 1일 경우 해당 위치 값 x,y를 이용하여 Element객체를 만들어 Queue에 넣는다.
-
Queue에서 Element를 하나 꺼낸다. 해당 위치를 Root로 두고 y는 현재 위치 x는 다음 위치로 DFS 연산을 진행한다.
-> DFS 연산은 가리키는 곳이 값이 1이면서 방문하지 않은 곳이면 Root의 next 위치에서 다음 next 값들을 1로 바꿔준다.(이동 가능함을 체크한다는 의미) 그렇지 않으면 종료
-> 만약 Root값과 가리키는 값이 같으면 종료.
-
그려진 맵을 출력
아래에는 코드입니다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[][] map;
static Queue<Element> queue = new LinkedList<Element>();
static int N;
static boolean[] visited;
public static void main(String[] args) {
Scanner scr = new Scanner(System.in);
N = scr.nextInt();
map = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int a = scr.nextInt();
map[i][j] = a;
if (map[i][j] == 1) {
queue.add(new Element(j, i));
}
}
}
while (!queue.isEmpty()) {
visited = new boolean[N];
Element element = queue.poll();
visited[element.x] = true;
dfs(element.y, element.y, element.x);
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public static void dfs(int root, int start, int next) {
if(root == next) {
return;
}
for (int i = 0; i < N; i++) {
if (map[next][i] == 1 && !visited[i]) {
visited[i] = true;
map[root][i] = 1;
dfs(root, next, i);
}
}
}
}
class Element {
int x, y;
public Element(int x, int y) {
this.x = x;
this.y = y;
}
}
이전에 풀었던 문제들을 다시 풀고 있는데 전에는 한번에 쉽게 풀었던 기록이 있는데 다시 푸니까 시간 초과 3번만에 다시 맞췄네요...
근본적으로 알고리즘을 풀기 위해 생각하는 방법이랑 좀더 깊이 생각하는 법이 부족한 것 같습니다. 하루에 30분 정도는 알고리즘 기초 강의 수강을 해야겠습니다.
'알고리즘(Java) > BFS&DFS' 카테고리의 다른 글
[백준, BFS, Java] P.2146 다리 만들기 (0) | 2021.09.20 |
---|---|
[백준, BFS, Java] P.2638 치즈 (0) | 2021.08.31 |
[백준, DFS, JAVA] P11725. 트리의 부모 찾기 (0) | 2020.10.07 |
[백준, DFS, JAVA] P.2668 숫자 고르기 (0) | 2019.12.05 |
[백준, BFS, JAVA] P.1707 이분 그래프 (0) | 2019.12.05 |
Comments