반응형
01-27 05:03
Today
Total
«   2025/01   »
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
관리 메뉴

개발하는 고라니

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

Programming/백준

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

조용한고라니 2021. 3. 15. 18:55
반응형
 

2668번: 숫자고르기

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

www.acmicpc.net


[DFS]

주어진 배열에서 사이클을 찾아 답을 출력할 배열에 입력하는 것이 목표이다. 나는 기존에 좀 복잡한 방법으로 사이클을 찾고 답을 출력했더니... 시간초과가 발생하였다. 그래서 어떻게 시간을 단축시킬까 하던 도중, 한 블로그를 보고 뒤통수를 맞은 느낌이었다. 너무나 쉬운 코드로 작성한 것을 보고 성찰의 시간을 갖기로 하였다. 블로그의 링크는 하단에 기재한다.

 

참고한 블로그의 풀이방식은 n회 DFS를 수행하며 DFS를 돌다 다음 정점이 처음 시작한 정점이라면 true를 반환하고 그 때의 인덱스를 정답 배열에 저장하는 방식이었다.

 

1 -> 3 -> 1

의 경우 1을 방문하고 3을 방문했는데 3은 다시 1을 가리키므로 1 - 3은 사이클이다. 이때 DFS는 true를 반환하고 1을 result 배열에 저장한다.

# Code </>

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

public class Main {

    static int[] arr = new int[101];
    static int[] result = new int[101];
    static boolean[] visit = new boolean[101];
    static boolean flag;

    static void DFS(int x, int start){

        if(!visit[x]){
        
            visit[x] = true;
            DFS(arr[x], start);
        }
        else
            flag = (x == start);
    }

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

        int n = Integer.parseInt(br.readLine());

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

        int idx = 0;
        
        visit = new boolean[101];
        
        for(int i=1; i<=n; i++) {
            flag = false;

            DFS(i, i);
            if(flag)
                result[idx++] = i;
        }

        System.out.println(idx);
        
        for(int i=0; i<idx; i++)
            System.out.println(result[i]);
    }
}

# Reference

쓰리디핏님의 블로그

반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 17836번 : 공주님을 구해라!  (0) 2021.03.16
[백준] 11779번 : 최소비용 구하기 2  (0) 2021.03.15
[백준] 13565번 : 침투  (0) 2021.03.14
[백준] 2512번 : 예산  (0) 2021.03.14
[백준] 2617번 : 구슬 찾기  (0) 2021.03.14
Comments