[백준] 2668 : 숫자고르기 - JAVA [자바]

2025. 4. 5. 13:48·PS/BAEKJOON

안녕하세요.

오늘은 숫자고르기 문제를 풀어보도록 하겠습니다.

 

 

    📌 접근

    원소를 순회할 때 사이클이 만들어진다면, 조건에 만족하는 수가 된다.

     

    ex1) 1 을 뽑을 수 있는지 ?

    1 -> 3 (arr[1]) -> 1 (arr[3]) -- 사이틀 발생 O

     

    ex2) 2 를 뽑을 수 있는지 ?
    2 -> 1 (arr[2]) -> 3 (arr[1]) -> 1 (arr[3]) -- 사이클 발생 X

     

    만약 조건을 만족하는 수라면, 리스트에 넣는다.

    최종 리스트를 오름차순 정렬하면 정답을 구할 수 있다.

    💻 풀이

    // hyeblee
    import java.io.*;
    import java.util.*;
    
    
    public class Main {
    	public static int N;
    	public static int[] line2;
    	public static boolean[] visited;
    	public static List<Integer> list = new ArrayList<>();
    	
    	public static void dfs(int start, int target) {
    		if(line2[start]==target) {
    			list.add(target);
    			return;
    		}
    		start = line2[start];
    		
    		if(!visited[start]) {
    			visited[start] = true;
    			dfs(start,target);
    			visited[start] = false;
    		}
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		N = Integer.parseInt(br.readLine());
    		line2 = new int[N+1];
    		visited = new boolean[N+1];
    		
    		for(int i=1;i<=N;i++) {
    			line2[i] = Integer.parseInt(br.readLine());
    		}
    		
    		for(int i=1;i<=N;i++) {
    			visited[i] = true;
    			dfs(i, i);
    			Arrays.fill(visited, false);
    		}
    		
    		Collections.sort(list);
    		System.out.println(list.size());
    		for(int n: list) {
    			System.out.println(n);
    		}
    	}
    }

    🤔 고민했던 점 & 어려웠던 부분

     

    처음에 dfs이고, 재귀를 사용해야한다고 생각했습니다.

    하지만 어떤 방식으로 재귀를 돌려야할지 감이 오지 않아서 다른 사람의 풀이를 참고했습니다.

    'PS > BAEKJOON' 카테고리의 다른 글

    [백준] 15652 : N과 M (5) - JAVA [자바]  (1) 2025.04.09
    [백준] 15652 : N과 M (4) - JAVA [자바]  (1) 2025.04.08
    [백준] 16954 : 움직이는 미로 탈출 - JAVA [자바]  (0) 2025.04.06
    [백준] 13549: 숨바꼭질 3 - JAVA [자바]  (0) 2025.04.04
    [백준] 1966번 : 프린터 큐 - JAVA [자바] _ 얕은복사/깊은 복사  (0) 2024.09.28
    'PS/BAEKJOON' 카테고리의 다른 글
    • [백준] 15652 : N과 M (4) - JAVA [자바]
    • [백준] 16954 : 움직이는 미로 탈출 - JAVA [자바]
    • [백준] 13549: 숨바꼭질 3 - JAVA [자바]
    • [백준] 1966번 : 프린터 큐 - JAVA [자바] _ 얕은복사/깊은 복사
    hyeblee
    hyeblee
    감자감자
    • hyeblee
      hyeblee
      hyeblee
    • 전체
      오늘
      어제
      • 분류 전체보기
        • PS
          • Programmers
          • BAEKJOON
          • CODETREE
        • ALGORITHM
        • JAVA
        • CS
          • 면접을 위한 CS전공지식
        • SPRING
        • 회고
    • 블로그 메뉴

      • 홈
      • 태그
      • 방명록
    • 링크

      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

      백트래킹
      상한값
      흐른 일수 계산
      구간 칠하기
      spring #스프링 #스프링부트 #springboot #please sign in
      날짜와 시간 계산
      백준
      탐색
      java
      플레이데이터 백엔드 후기
      backjoon
      java #deque #자바 #덱
      숨바꼭질3
      알고리즘
      java #스프링부트 #자바버전 #자바 버전 충돌 #jvm
      dfs
      플레이데이터 백엔드 부트캠프 후기
      15652
      플레이데이터 백엔드
      arrays.sort #collections.sort #list.sort #객체정렬 #배열정렬 #timsort #dual pivot quicksort #정렬 #자바
      자바
      BFS
      왔다 갔던 구역2
      하한값
      BOJ
      플레이데이터 백엔드 부트캠프
      16954
      반닫힌 구간
      흐른 시간 계산
      spring #springboot #스프링 #스프링부트
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    hyeblee
    [백준] 2668 : 숫자고르기 - JAVA [자바]
    상단으로

    티스토리툴바