코테/백준

[백준/JAVA] 13023번: ABCDE

imname1am 2023. 4. 17. 15:31
반응형

🔺 문제

 

13023번: ABCDE

문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.

www.acmicpc.net

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M;
    static ArrayList<Integer>[] A;  // 그래프 데이터 저장 인접 리스트
    static boolean[] visited;       // 방문 배열
    static boolean arrive;          // 🔔 도착 여부
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        
        A = new ArrayList[N];
        for(int i = 0 ; i < N ; i++) {
            A[i] = new ArrayList<>();
        }
        visited = new boolean[N];
        arrive = false;
        
        // 인접 리스트 초기화
        while(M -- > 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            A[a].add(b);
            A[b].add(a);
        }
        
        // 🎈 각 점에 대해  dfs 수행 🎈
        for(int i = 0 ; i < N ; i++) {
            dfs(i, 1);  // depth 1부터 시작
            
            if(arrive)
                break;
        }
        
        System.out.println(arrive ? 1 : 0);
    }
    
    private static void dfs(int now, int depth) {
        // 종료 조건 : depth가 5가 되었을 때
        if(depth == 5 || arrive) {
            arrive = true;
            return;
        }
        
        visited[now] = true;
        for(int next : A[now]) {
            if(!visited[next]) {
                dfs(next, depth + 1);   // 재귀 호출 돌 때마다 1씩 증가
            }
        }
        visited[now] = false;   // 🔔 백트래킹 🔔 (now 노드의 모든 인접 노드들 방문 후, now 노드를 다시 방문할 수 있도록)
    }
}
cs
✅ 해결 아이디어
- DFS
- DFS 수행할 때, 재귀 호출마다 깊이를 더함. (깊이가 5 이상이면 1 / 아니면 0 출력)
- visited[now] = false; : 현재 노드 now 방문 후, 해당 노드를 다시 방문 가능한 상태로 되돌리기 위해 사용

 

⇨ 52~57번째 줄을 이렇게 써도 된다.

for(int i : A[now]) {
    if(!visited[i]) {
        visited[now] = true;
        DFS(i, depth + 1);  // 재귀 호출 돌 때마다 depth 1씩 증가
        visited[now] = false;
    }
}

 

 

 


🔺 다른 풀이들

- 풀이1) 자세한 설명,,,,굿

 

[백준 - Java] 13023번 : ABCDE

문제 더보기 www.acmicpc.net/problem/13023 BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다. 오늘은 다음과 같은 친구 관계를 가

minhamina.tistory.com

친절한 설명 너무너무 감사합니다ㅠㅠㅠ

 

 

- 풀이2) DFS 호출 횟수로 판단

 

[백준] 13023. ABCDE (Java)

문제 https://www.acmicpc.net/problem/13023 13023번: ABCDE 문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다. www.acmicpc.net 풀이 0. 문제 해석 DFS로 깊이를 체크하면 풀 수 있는 문제이다. 인

hanyeop.tistory.com

DFS 호출 횟수가 4 이상(=5개의 노드가 연속되게 존재)이면 리턴하게 했고,

DFS for문 안의 if문 안에 visited[i] = false; 코드도 함께 넣어주셨다.

 


💬 느낀 점

🔶 연결 요소 갯수 / 재귀 깊이 → DFS 수행 횟수와 연관 有

 

 

1회독 2회독 3회독 4회독 5회독
V 6.15 8.30    

 

(+ 3회독 : 8.30)

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M;
    
    static ArrayList<Integer>[] A;    // 인접 리스트
    static boolean[] visited;
    static boolean flag;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        
        A = new ArrayList[N];
        for(int i = 0 ; i < N ; i++) {
            A[i] = new ArrayList<>();
        }
        
        visited = new boolean[N];
        flag = false;
        
        while(M --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            A[a].add(b);
            A[b].add(a);
        }
        
        for(int i = 0 ; i < N ; i++) { // 모든 점에 대해 DFS 수행
            dfs(i, 1);
            
            if(flag) break;
        }
        
        System.out.println(flag ? 1 : 0);
    }
    
    private static void dfs(int startIdx, int depth) {
        // 종료  조건
        if(depth == 5 || flag) {
            flag = true;
            return;
        }
        
        visited[startIdx] = true;
        
        for(int next : A[startIdx]) {
            if(!visited[next]) {
                dfs(next, depth + 1);
            }
        }
        
        visited[startIdx] = false;
    }
}
cs

반응형