관리 메뉴

Storage Gonie

(4) [C++, Java] 백준 No.10451 : 순열 사이클 본문

알고리즘/백준풀이9. 그래프

(4) [C++, Java] 백준 No.10451 : 순열 사이클

Storage Gonie 2019. 5. 30. 12:26
반응형

문제

풀이

자세한 풀이 : https://ldgeao99.tistory.com/398

# C++(dfs탐색을 재귀 구현으로 푼것)

#include <iostream>
#include <cstring>
using namespace std;

int arr[1001];      // 인접 리스트
bool check[1001];   // 인접 리스트
void dfs(int node);

int main()
{
    int t;
    cin >> t;

    while(t--){
        int v;
        cin >> v;

        // 정보를 입력받아 원소가 1개인 인접 리스트 생성
        for (int i = 1; i <= v; i++){
            int a;
            cin >> a;
            arr[i] = a;
        }

        // 다음 테스트 케이스를 위한 초기화
        memset(check, false, sizeof(check));

        // 탐색이 진행된 횟수 카운트
        int ans = 0;
        for (int i = 1; i <= v; i++){
            if (check[i] == false){
                ans += 1;
                dfs(i);
            }
        }

        // 결과출력
        cout << ans << "\n";
    }
}

void dfs(int node){
    check[node] = true;
    //cout << node << "";
    int next = arr[node];
    if (check[next] == false){
        dfs(next);
    }
}

# C++(dfs탐색을 비재귀 구현으로 푼것)

#include <iostream>
#include <cstring>
using namespace std;

int arr[1001];      // 인접 리스트
bool check[1001];   // 인접 리스트

int main()
{
    int t;
    cin >> t;

    while(t--){
        int v;
        cin >> v;

        // 정보를 입력받아 원소가 1개인 인접 리스트 생성
        for (int i = 1; i <= v; i++){
            int a;
            cin >> a;
            arr[i] = a;
        }

        // 다음 테스트 케이스를 위한 초기화
        memset(check, false, sizeof(check));

        // 탐색이 진행된 횟수 카운트
        int ans = 0;
        for (int i = 1; i <= v; i++){
            if (check[i] == false){
                ans += 1;
                // DFS탐색
                int node = i;
                while(check[node] == false){
                    check[node] = true;
                    node = arr[node];
                }
            }
        }

        // 결과출력
        cout << ans << "\n";
    }
}


# Java

import java.util.*;

public class Main {
    public static void dfs(int[] a, boolean[] c, int x) {
        if (c[x]) return;
        c[x] = true;
        dfs(a, c, a[x]);
    }
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            int n = sc.nextInt();
            int[] a = new int[n+1];
            boolean[] c = new boolean[n+1];
            for (int i=1; i<=n; i++) {
                a[i] = sc.nextInt();
                c[i] = false;
            }
            int ans = 0;
            for (int i=1; i<=n; i++) {
                if (c[i] == false) {
                    dfs(a, c, i);
                    ans += 1;
                }
            }
            System.out.println(ans);
        }

    }
}
반응형
Comments