반응형
백준 13023번 문제 - ABCDE
13023번: ABCDE
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
www.acmicpc.net
문제 분석
- 5가지 숫자가 순서대로 연결되어있으면 1, 아니면 0을 출력하는 문제
해결 키 포인트
- DFS(깊이 우선 탐색) 개념 파악
- 노드 확인했는지 체크해주는 변수 초기화 적절하게 해야함
- 해당 index 노드 인접노드 확인 끝나면, 해당 노드 false로 다시 초기화
깊이 우선 탐색(DFS)
그래프 완전 탐색 기번 중 하나로, 그래프의 시작 노드에서 출발하여 탐색할 한 쪽 분기를 정하여 최대 깊이까지 탐색을 마친 후 다른 쪽 분기로 이동하여 다시 탐색을 수행하는 알고리즘이다.
깊이 우선 탐색은 실제 구현 시 재귀 함수를 이용하므로 스택 오버플로에 유의해야 한다.
깊이 우선 탐색의 핵심 이론
- 한번 방문한 노드를 다시 방문하면 안되므로 노드 방문 여부를 체크할 배열이 필요
- 그래프는 인접 리스트로 표현
- DFS의 탐색 방식은 후입 선출 특성을 가짐 ( 재귀함수 사용 많음 / 스택도 사용 )
알고리즘
1. DFS를 시작할 노드를 정한 후 사용할 자료구조 초기화
2. 스택에서 노드를 꺼낸 후 꺼낸 노드의 인접 노드를 다시 스택에 삽입 (이를 모든 정점을 다한다)
만약 스택에 노드가 없으면, 방문하지 않은 정점을 알아내, 스택에 삽입하고 다시 2번 단계를 반복한다.
코드
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
// 현재 조건을 만족하는 친구관계가 있는지에 대한 변수
public static boolean checkFriendShip = false;
// 해당 index가 검사됬는지 확인하는 변수
public static boolean [] checkIndex;
// 각 index의 근접 노드를 저장하는 변수
public static ArrayList [] list;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
// N, M 입력
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 변수 세팅
list = new ArrayList[N];
for(int i=0;i<N;i++) {
list[i] = new ArrayList();
}
// M번 반복해서 수 입력
for(int i=0;i<M;i++) {
st = new StringTokenizer(br.readLine());
int first = Integer.parseInt(st.nextToken());
int second = Integer.parseInt(st.nextToken());
// 인접 노드 등록
list[first].add(second);
list[second].add(first);
}
br.close();
// 모든 수를 확인하면서 DFS 확인
for(int i=0;i<N;i++) {
checkIndex = new boolean[N];
DFS(i, 1);
// 친구관계를 만족했을 경우, 종료
if(checkFriendShip) break;
}
// 친구관계를 만족한 경우 1, 아닌 경우 0 출력
if(checkFriendShip)
bw.write("1");
else
bw.write("0");
bw.flush();
bw.close();
}
public static void DFS(int index, int count) {
// 확인 된 변수 일 경우, return
if(checkIndex[index]) {
return;
}
// 깊이가 5일 경우 친구관계를 만족한 것이므로 true로 변환 후 return
if(count == 5) {
checkFriendShip = true;
return;
}
// 확인했으니 확인했다고 해당 변수 변환
checkIndex[index] = true;
// 지금 연관된 인접노드 확인하면서 count 확인
for(int i=0;i<list[index].size();i++) {
DFS((Integer) list[index].get(i), count+1);
// count가 만족하면 종료
if(checkFriendShip)
break;
}
// 다음 DFS에 방해되지 않게 초기화
checkIndex[index] = false;
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 2178] 미로 탐색 (JAVA) (0) | 2023.08.09 |
---|---|
[백준 1260] DFS와 BFS (JAVA) (0) | 2023.08.09 |
[백준 2023] 신기한 소수 (JAVA) (0) | 2023.08.06 |
[백준 11724] 연결 요소의 개수 (JAVA) (0) | 2023.08.03 |
[백준 10989] 수 정렬하기 3 (JAVA) (0) | 2023.08.01 |