[알고리즘/백준] 10451번 : 순열 사이클(Java)

2025. 5. 31. 22:01·Algorithms & Education/알고리즘
문제 10451번 : 순열 사이클
문제링크 https://www.acmicpc.net/problem/10451
난이도 S3
언어 Java
분류 그래프이론 | 그래프이론, 그래프탐색, 순열 사이클 분할

 

 

📌 최종 정답 코드

import java.io.*;
import java.util.*;

public class Main {
    // 방문 여부를 저장할 배열 (각 인덱스의 노드가 방문되었는지)
    static boolean[] visited;

    // 입력으로 주어지는 순열을 저장할 배열
    static int[] permutation;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 테스트 케이스 수 입력
        int T = Integer.parseInt(br.readLine());

        // 각 테스트 케이스마다 처리
        while (T-- > 0) {
            // 순열의 길이 N 입력
            int N = Integer.parseInt(br.readLine());

            // 순열 배열 및 방문 배열 초기화
            permutation = new int[N + 1]; // 1-based index 사용
            visited = new boolean[N + 1];

            // 순열 정보 입력
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 1; i <= N; i++) {
                permutation[i] = Integer.parseInt(st.nextToken());
            }

            int cycleCount = 0; // 사이클 개수를 셀 변수

            // 1부터 N까지의 모든 노드를 확인
            for (int i = 1; i <= N; i++) {
                // 아직 방문하지 않은 노드라면 새로운 사이클의 시작점
                if (!visited[i]) {
                    dfs(i); // 해당 노드를 시작으로 DFS 탐색
                    cycleCount++; // 탐색이 끝나면 하나의 사이클이 끝났음을 의미
                }
            }

            // 현재 테스트 케이스의 결과 출력
            bw.write(cycleCount + "\n");
        }

        // 출력 버퍼 비우고 닫기
        bw.flush();
        bw.close();
        br.close();
    }

    // DFS(깊이 우선 탐색)를 사용하여 사이클 탐색
    static void dfs(int node) {
        visited[node] = true; // 현재 노드 방문 처리

        // 순열에 의해 이동할 다음 노드
        int next = permutation[node];

        // 다음 노드를 아직 방문하지 않았다면 계속 탐색
        if (!visited[next]) {
            dfs(next);
        }

        // 이미 방문한 노드라면 사이클이 완성되었음을 의미하므로 종료
    }
}


📌 구해야 하는 정답

- 각 테스트 케이스마다, 입력으로 주어진 순열에 존재하는 순열 사이클의 개수를 출력


📌 코드 설계하기

1. 테스트 케이스 수 입력

2. 테스트 케이스마다 처리

 - 순열의 길이 입력

 - 순열 배열 및 방문 배열 초기화

 - 순열 정보 입력

 - DFS 탐색

 

 

 

'Algorithms & Education > 알고리즘' 카테고리의 다른 글

[알고리즘/백준] 11724번 :연결 요소의 개수(Java)  (1) 2025.06.02
[알고리즘/백준] 17204번 : 죽음의 게임(Java)  (0) 2025.06.01
[알고리즘/백준] 1463번 : 1로 만들기(Java)  (1) 2025.05.30
[알고리즘/백준] 1010번 : 다리 놓기(Java)  (1) 2025.05.29
[알고리즘/백준] 2775번 : 부녀회장이 될테야(Java)  (1) 2025.05.28
'Algorithms & Education/알고리즘' 카테고리의 다른 글
  • [알고리즘/백준] 11724번 :연결 요소의 개수(Java)
  • [알고리즘/백준] 17204번 : 죽음의 게임(Java)
  • [알고리즘/백준] 1463번 : 1로 만들기(Java)
  • [알고리즘/백준] 1010번 : 다리 놓기(Java)
min_sol
min_sol
  • min_sol
    ෆ스누피가 찰리찰리해ෆ
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • Programming Languages (51)
        • JAVA (40)
        • C# (11)
      • Database (11)
        • oracle (7)
        • postgresql (3)
        • mysql (0)
      • Data & AI (5)
        • 빅데이터 (1)
        • AI (4)
      • Tools & Collaboration (30)
        • GitHub (10)
        • RPA (20)
      • GIS (1)
      • Web Development (58)
        • Spring (11)
        • JSP (11)
        • Front (1)
        • Vue (14)
        • PyQt (10)
        • Next.js (4)
      • Networking & Security (14)
        • TCP_IP (5)
        • 보안 (9)
      • Mobile (6)
        • 안드로이드스튜디오 (6)
      • Others (4)
        • 일상 (2)
        • 2021 (2)
      • Algorithms & Education (58)
        • 알고리즘 (52)
        • 세미나 | 교육 (5)
        • 자격증 (1)
  • 블로그 메뉴

    • 홈
    • 글쓰기
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    연습문제
    자동화
    RPA
    자바
    생능출판
    PyQt5
    백준
    VUE
    vue.js
    자료구조
    Java
    스윙
    jsp
    알고리즘
    이클립스
    명품자바에센셜
    PyQt
    spring
    계산기
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[알고리즘/백준] 10451번 : 순열 사이클(Java)
상단으로

티스토리툴바