일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java
- ★
- 다이나믹 프로그래밍
- 백준단계별로풀어보기
- 시간 복잡도
- 동적계획법
- 코딩공부
- 자바공부
- dp
- 자바의정석연습문제풀이
- 백트래킹
- 빅오 표기법
- BFS
- 자바의정석
- 백준알고리즘
- 알고리즘공부
- 자바
- 백준9단계
- dfs
- 백준
- 브루트포스
- 무료코딩강의
- 자바개념
- 알고리즘
- 개발공부
- Java개념
- ☆
- 무료개발강의
- 백준자바
- 자바의정석연습문제
- Today
- Total
더 많이 실패하기
공부 194일차: 백준 16940번 BFS 스페셜 저지 자바 java 본문
16940 BFS 스페셜 저지
https://www.acmicpc.net/problem/16940
16940번: BFS 스페셜 저지
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
www.acmicpc.net
백준 16940번 문제 BFS 스페셜 저지
문제
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 7688 | 2064 | 1242 | 24.473% |
문제
BOJ에서 정답이 여러가지인 경우에는 스페셜 저지를 사용한다. 스페셜 저지는 유저가 출력한 답을 검증하는 코드를 통해서 정답 유무를 결정하는 방식이다. 오늘은 스페셜 저지 코드를 하나 만들어보려고 한다.
정점의 개수가 N이고, 정점에 1부터 N까지 번호가 매겨져있는 양방향 그래프가 있을 때, BFS 알고리즘은 다음과 같은 형태로 이루어져 있다.
- 큐에 시작 정점을 넣는다. 이 문제에서 시작 정점은 1이다. 1을 방문했다고 처리한다.
- 큐가 비어 있지 않은 동안 다음을 반복한다.
- 큐에 들어있는 첫 정점을 큐에서 꺼낸다. 이 정점을 x라고 하자.
- x와 연결되어 있으면, 아직 방문하지 않은 정점 y를 모두 큐에 넣는다. 모든 y를 방문했다고 처리한다.
2-2 단계에서 방문하지 않은 정점을 방문하는 순서는 중요하지 않다. 따라서, BFS의 결과는 여러가지가 나올 수 있다.
트리가 주어졌을 때, 올바른 BFS 방문 순서인지 구해보자.
입력
첫째 줄에 정점의 수 N(2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에는 트리의 간선 정보가 주어진다. 마지막 줄에는 BFS 방문 순서가 주어진다. BFS 방문 순서는 항상 N개의 정수로 이루어져 있으며, 1부터 N까지 자연수가 한 번씩 등장한다.
출력
입력으로 주어진 BFS 방문 순서가 올바른 순서면 1, 아니면 0을 출력한다.
예제 입력 1
4
1 2
1 3
2 4
1 2 3 4
예제 출력 1
1
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
예제 입력 2
4
1 2
1 3
2 4
1 2 4 3
예제 출력 2
0
과정 생각해보기 & 오답
https://gimbalja.tistory.com/345
공부 192일차: 백준 16964번 DFS 스페셜 저지 자바 java
16964 DFS 스페셜 저지 https://www.acmicpc.net/problem/16964 16964번: DFS 스페셜 저지 첫째 줄에 정점의 수 N(2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에는 트리의 간선 정보가 주어진다. 마지막 줄
gimbalja.tistory.com
매우 유사한 문제
https://gimbalja.tistory.com/328
공부 181일차: 백준 1260번 DFS와 BFS 자바 java
1260 DFS와 BFS https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이
gimbalja.tistory.com
이 문제로 DFS와 BFS 코드를 어떻게 구현하는지 한눈에 비교해보는 것도 문제를 이해하는 데 도움이 될 것 같다
트리 구조인 이 문제에서, 1번부터 BFS 탐색을 시작할 때
2로 갈지, 3으로 갈지를 고를 수 있다
어느 것을 선택해도 깊이 우선 탐색이라는 사실은 변하지 않으므로 1 2 3 4 / 1 3 2 4 모두 가능하다
그래서 가능한 자식 노드들의 경우를 저장해야 한다
정답 인정 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int idx = 1; // 두번째부터 비교.확인
static ArrayList<ArrayList<Integer>> list;
static boolean[] visited;
static int[] store;
static int result = 1;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
list = new ArrayList<>();
store = new int[n];
visited = new boolean[n];
for(int i = 0; i < n; i++) {
list.add(new ArrayList<>());
}
for(int i = 0; i < n-1; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
// 양방향
list.get(x).add(y);
list.get(y).add(x);
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
store[i] = Integer.parseInt(st.nextToken())-1;
}
if(store[0] != 0) { // 시작점이 달라지면 프로그램 종료
System.out.println(0);
return;
}
bfs(0);
System.out.println(result);
}
static void bfs(int x) {
Queue<Integer> q = new LinkedList<>();
q.add(x); // 탐색 시작
visited[x] = true; // 방문 처리
while(!q.isEmpty()) {
HashSet<Integer> set = new HashSet<>();
int val = q.poll();
// 가능한 경로 확인
for(int next : list.get(val)) {
if(!visited[next]) {
set.add(next);
visited[next] = true;
}
}
int size = set.size();
if(size == 0) {
return;
}
for(int i = idx; i < idx+size; i++) { // 다음 자리부터 가능한 자리까지
if(set.contains(store[i])) { // set에 들어가있다 == 자식 노드다
q.add(store[i]); // 큐에 넣기
}else {
result = 0;
return;
}
}
idx += size;
}
}
}
|
cs |
dfs를 먼저 풀어서 수월했다
확실히 dfs보다 bfs가 더 어렵게 느껴지긴 하지만~
'알고리즘 > 백준' 카테고리의 다른 글
공부 197일차: 백준 24445번 알고리즘 수업 - 너비 우선 탐색 2 자바 java (0) | 2023.02.12 |
---|---|
공부 195-196일차: 백준 2146번 다리 만들기 자바 java (0) | 2023.02.10 |
공부 192일차: 백준 16964번 DFS 스페셜 저지 자바 java (0) | 2023.02.07 |
공부 191일차: 백준 16947번 서울 지하철 2호선 자바 java (0) | 2023.02.06 |
공부 190일차: 백준 16929번 Two Dots 자바 java (0) | 2023.02.05 |