250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 막내의막무가내 프로그래밍
- 부스트코스에이스
- 막내의막무가내 코틀린
- 막내의막무가내 플러터 flutter
- 막내의막무가내 플러터
- 막내의막무가내 SQL
- 막내의막무가내 안드로이드
- 안드로이드 Sunflower 스터디
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내
- 막내의막무가내 rxjava
- 막내의 막무가내 알고리즘
- flutter network call
- 막내의막무가내 알고리즘
- 막내의막무가내 일상
- 부스트코스
- 주택가 잠실새내
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 목표 및 회고
- 주엽역 생활맥주
- 프로그래머스 알고리즘
- 안드로이드 sunflower
- 프래그먼트
- 막무가내
- 안드로이드
- Fragment
- 막내의 막무가내
- 2022년 6월 일상
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 코볼 COBOL
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘] 백준 1260 DFS와 BFS -인접행렬 사용 bfs, dfs- 본문
728x90
https://www.acmicpc.net/problem/1260
최근 알고리즘 공부중에 있다.
BFS, DFS 응용문제를 풀다가 인접행렬로도 구현할 줄 알아야한다는 것을 느끼고 이전에 인접 리스트로 풀었던 문제를 인접행렬로 풀어봤다.
차근차근 공부 후 응용문제들을 풀어볼 예정이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int map[][]; // 인접배열
static boolean dfsVisited[]; //노드 방문 여부
static boolean bfsVisited[];
static int nodeCount;
static int edgeCount;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
//최대 정점의 개수 N(1 ≤ N ≤ 1,000)
nodeCount = Integer.parseInt(st.nextToken());
map = new int[nodeCount + 1][nodeCount + 1];
dfsVisited = new boolean[nodeCount + 1];
bfsVisited = new boolean[nodeCount + 1];
//최대 간선의 개수 M(1 ≤ M ≤ 10,000)
edgeCount = Integer.parseInt(st.nextToken());
//시작 정점 노드
int startNode = Integer.parseInt(st.nextToken());
//맵 세팅 (인덱스 1부터 세팅함)
for (int i = 1; i <= edgeCount; i++) {
st = new StringTokenizer(br.readLine());
int node1 = Integer.parseInt(st.nextToken());
int node2 = Integer.parseInt(st.nextToken());
map[node1][node2] = map[node2][node1] = 1;
}
//탐색 시작
dfs(startNode);
System.out.println();
bfs(startNode);
}
static void dfs(int currentNode) {
if (dfsVisited[currentNode] == true) {
return;
}
dfsVisited[currentNode] = true;
System.out.print(currentNode + " ");
for (int j = 1; j <= nodeCount; j++) {
//연결되고 방문 안된 노드 탐색 (낮은 노드부터 방문됨)
if (map[currentNode][j] == 1 && dfsVisited[j] == false) {
dfs(j);
}
}
}
static void bfs(int currentNode) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(currentNode);
bfsVisited[currentNode] = true;
System.out.print(currentNode + " ");
while (!queue.isEmpty()) {
currentNode = queue.poll();
//현재 노드와 연결된 방문안된 노드들을 방문 후 큐에 추가
for (int j = 1; j <= nodeCount; j++) {
if (map[currentNode][j] == 1 && bfsVisited[j] == false) {
queue.offer(j);
bfsVisited[j] = true;
System.out.print(j + " ");
}
}
}
}
}
밑은 스캐너로 풀었다. (예전에 백준을 스캐너로 풀었다가 계속 효울성에서 에러가나서 그 뒤로 버퍼드로 푸는 습관을 들였는데 이 문제는 스캐너로도 잘 풀렸다. 스캐너가 확실히 편하긴 하다...)
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int map[][]; // 인접배열
static boolean dfsVisited[]; //노드 방문 여부
static boolean bfsVisited[];
static int nodeCount;
static int edgeCount;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
//최대 정점의 개수 N(1 ≤ N ≤ 1,000)
nodeCount = sc.nextInt();
map = new int[nodeCount + 1][nodeCount + 1];
dfsVisited = new boolean[nodeCount + 1];
bfsVisited = new boolean[nodeCount + 1];
//최대 간선의 개수 M(1 ≤ M ≤ 10,000)
edgeCount = sc.nextInt();
//시작 정점 노드
int startNode = sc.nextInt();
//맵 세팅 (인덱스 1부터 세팅함)
for (int i = 1; i <= edgeCount; i++) {
int node1 = sc.nextInt();
int node2 = sc.nextInt();
map[node1][node2] = map[node2][node1] = 1;
}
//탐색 시작
dfs(startNode);
System.out.println();
bfs(startNode);
}
static void dfs(int currentNode) {
if (dfsVisited[currentNode] == true) {
return;
}
dfsVisited[currentNode] = true;
System.out.print(currentNode + " ");
for (int j = 1; j <= nodeCount; j++) {
//연결되고 방문 안된 노드 탐색 (낮은 노드부터 방문됨)
if (map[currentNode][j] == 1 && dfsVisited[j] == false) {
dfs(j);
}
}
}
static void bfs(int currentNode) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(currentNode);
bfsVisited[currentNode] = true;
System.out.print(currentNode + " ");
while (!queue.isEmpty()) {
currentNode = queue.poll();
//현재 노드와 연결된 방문안된 노드들을 방문 후 큐에 추가
for (int j = 1; j <= nodeCount; j++) {
if (map[currentNode][j] == 1 && bfsVisited[j] == false) {
queue.offer(j);
bfsVisited[j] = true;
System.out.print(j + " ");
}
}
}
}
}
728x90
'알고리즘 > DFS, BFS, 시뮬, 백트래킹' 카테고리의 다른 글
[알고리즘] 백준 2178 미로 탐색 -bfs, dfs- 자바 코틀린 (0) | 2020.03.05 |
---|---|
[알고리즘] 백준 1012 유기농 배추 -dfs, bfs- 자바 코틀린 (0) | 2020.03.04 |
[알고리즘] 백준 2667 단지번호붙이기 -dfs, bfs- 코틀린 자바 (0) | 2020.03.03 |
[알고리즘] 백준 2660 바이러스 -bfs, dfs- (2) | 2020.02.27 |
[알고리즘] 백준 1260 DFS와 BFS -인접리스트 사용 bfs, dfs- (0) | 2020.01.12 |
Comments