코테/백준

[백준/JAVA] 10451번: 순열 사이클

imname1am 2023. 7. 18. 01:29
반응형

🔺 문제

 

10451번: 순열 사이클

1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int T, N, cnt;
    static int[] A; // 점 저장 배열
    static boolean[] visited;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        T = Integer.parseInt(br.readLine());
        while(T --> 0) {
            N = Integer.parseInt(br.readLine());
            
            // 변수들 초기화
            A = new int[N + 1];
            visited = new boolean[N + 1];
            cnt = 0;
            
            // 입력받기
            st = new StringTokenizer(br.readLine(), " ");
            for(int i = 1 ; i <= N ; i++) {
                A[i] = Integer.parseInt(st.nextToken());
            }
            
            for(int i = 1 ; i <= N ; i++) {
                if(!visited[i]) {
                    dfs(i);
                    cnt++;    // 🔔 사이클 개수 = 정점들의 집합 개수 🔔
                }
            }
            sb.append(cnt).append("\n");
        }
        
        System.out.println(sb);
    }
    
    private static void dfs(int num) {
        if(visited[num])    return;
        
        visited[num] = true;
        
        if(!visited[A[num]]) {
            dfs(A[num]);
        }
    }
}
 
cs
✅ 해결 아이디어
✔ DFS
- 사이클 개수 = 정점들의 집합 개수 =  DFS 함수 호출 횟수

 

 

 


🔺 다른 풀이들

- dfs를 int형으로 받아서 1이나 0 리턴하게... 그리고 그 횟수를  cnt에 더함

 

로그인

 

www.acmicpc.net


💬 느낀 점

리스트로 받으려고 했는데

생각해보니까 순열이 N개로 이뤄져있으니까 수끼리 겹칠 일이 없으니까

배열로 해도 되는 것이었당.....

 

DFS 오랜만에 쓰면 또 까먹는....ㅠ

 

DFS나 BFS는 문제들 나오는 유형은 크게 다르지 않은 것 같은데

말을 어떻게 하느냐에 따라.. 괜히 헤매게 되는 거 같다.😭

 

 + 이번 삼성DX 하계 알고리즘 특강 1번 문제도 사이클 여부 판단하는 거 써야했던 거 같은디...

1회독 2회독 3회독 4회독 5회독
V 8.4      

 

(+8.4 2회독)

코드 확인하기
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
import java.util.*;
import java.io.*;
 
public class Main {
    static int T, N, cnt;
    static int[] A;
    static boolean[] visited;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        T = Integer.parseInt(br.readLine());
        while(T --> 0) {
            N = Integer.parseInt(br.readLine());
            
            A = new int[N + 1];
            visited = new boolean[N + 1];
            cnt = 0;
            
            st = new StringTokenizer(br.readLine(), " ");
            for(int i = 1 ; i <= N ; i++) {
                A[i] = Integer.parseInt(st.nextToken());
            }
 
            for(int i = 1 ; i <= N ; i++) {
                if(!visited[i]) {
                    dfs(i);
                    cnt++;
                }
            }
            sb.append(cnt).append("\n");
        }
        
        System.out.println(sb);
    }
    
    private static void dfs(int num) {
        if(visited[num]) return;
        
        visited[num] = true;
        if(!visited[A[num]]) {
            dfs(A[num]);
        }
    }
}
cs

 


(참고)

✔ 풀이 참고

 

[백준] 10451 - 순열 싸이클 (JAVA)

문제 https://www.acmicpc.net/problem/10451 풀이 주어진 배열을 그래프로 사용 했을 때 만들어지는 사이클의 갯수를 반환하는 문제 -> 해당 문제에서는 모든 그래프가 사이클로 주어지기 때문에 이어지는

velog.io

 

 

✔ 그래프에서 사이클 찾기

 

[알고리즘] 그래프(Graph)에서 사이클(Cycle) 찾기

[알고리즘] 그래프(Graph)에서 사이클(Cycle) 찾기 사이클을 찾기 위해서는 DFS를 활용한다. (정점 : v, 간선 : e) - visited[] : 점들의 방문여부가 저장된 배열 - recur[] : v가 지금까지 방문한 점이 저장된

kim6394.tistory.com

 

반응형