코딩문제풀이/Baekjoon

[Java] 백준 2668번 : 숫자고르기

코딩하는 포메라니안 2023. 2. 13. 16:50

1. 문제

https://www.acmicpc.net/problem/2668

 

2668번: 숫자고르기

세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절

www.acmicpc.net

 

 

2. 풀이 과정

흔히 union & find를 구현할 때, find에서 사이클 여부를 판단한다.

이 문제는 find의 로직과 유사하게 구현할 수 있다.

사이클이 되는 모든 값을 결과로 출력하면 되는 문젠데, 처음부터 그래프 유형인걸 파악못해서 시간이 걸렸다.

 

1. for문으로 첫 번째 줄의 값을 처음부터 끝까지 탐색한다.

2. 각 값마다 cycle이 되는지 확인하고, cycle이면 결과 값에 담는다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    static int N, cnt;
    static int[] arr;
    static boolean[] visited;
    static StringBuilder sb;

    public static void main(String[] args) throws Exception {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N + 1];
        visited = new boolean[N + 1];
        sb = new StringBuilder();

        for(int i=1; i<=N; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        for(int i=1; i<=N; i++){
            visited[i] = true;
            dfs(i, i);
            visited[i] = false;
        }
        System.out.print(cnt);
        System.out.print(sb);
    }

    public static void dfs(int start, int now){
        if(arr[now] == start){
            cnt++;
            sb.append("\n").append(start);
            return;
        }

        if(!visited[arr[now]]){
            visited[arr[now]] = true;
            dfs(start, arr[now]);
            visited[arr[now]] = false;
        }
    }

}

 

 

결과