티스토리 뷰

문제풀이/백준

2668. 숫자고르기

BiteSnail 2024. 1. 7. 11:01

문제 개요

N개의 숫자와 대응하는 숫자가 주어졌을 때 서로 연결된 숫자들을 구하는 문제입니다.

문제 접근

각 숫자들은 하나의 숫자만을 가지기 때문에 자기 자신을 포함하거나 포함하지 않는 경로가 만들어질 수 있습니다.
따라서 첫 번째 DFS를 통해 경로의 시작 위치를 파악하고 두 번째 DFS를 통해 경로를 구성하는 숫자들을 모두 구할 수 있습니다.

HashSet이 정렬된 상태로 저장되는 것이 아니라는 것을 몰라서 틀렸던 문제였습니다.

소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Main {
    static int N;
    static int[] nums;
    static void input() throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(bf.readLine());
        nums = new int[N+1];
        for(int i=1;i<=N;i++){
            nums[i] = Integer.parseInt(bf.readLine());
        }
    }

    static Set<Integer> getCycleNodes(int node){
        Set<Integer> nodes = new HashSet<>();
        while(!nodes.contains(node)){
            nodes.add(node);
            node = nums[node];
        }
        nodes.clear();
        while(!nodes.contains(node)){
            nodes.add(node);
            node = nums[node];
        }

        return nodes;
    }

    static void process(){
        Set<Integer> nodes = new HashSet<>();
        for(int i=1;i<=N;i++){
            nodes.addAll(getCycleNodes(i));
        }
        System.out.println(nodes.size());
        nodes.stream().sorted().forEach(System.out::println);
    }

    public static void main(String[] args) throws IOException {
        input();
        process();
    }
}

문제

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

'문제풀이 > 백준' 카테고리의 다른 글

15686. 치킨 배달  (0) 2024.01.10
14501. 퇴사  (0) 2024.01.09
2659. 십자카드 문제  (0) 2024.01.03
1244. 스위치 켜고 끄기  (0) 2024.01.02
2302. 극장 좌석  (0) 2024.01.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함