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

2018. 5. 19. 17:47· 알고리즘 풀이/백준
728x90

이게 초등부문제라는게 믿기지가 않는다.


index에 속한 값을 이용하여 또 다른 index로 넘어가는


개념을 알아야 하는데, num[i] -> num[num[i]] -> num[ num[ num[i] ] ] -> ...


이렇게 반복하여 rotation을 시켜주다가


'마지막으로 도착하는 index가 가진 값' 


'최초의 index'의 값과 같아야 한다.


이렇게 되면 지금까지 지나간 index들이 모두 하나의 고리처럼 연결되어


문제에서 요구하는 숫자들의 집합이 된다.


이를 위해서 주의해야 할점은 Visited라는 boolean배열을 통해


rotation을 하면서 들렀던 index를 체크해주는 것이 중요하다.


그렇지 않으면 무한재귀할 수 있다.


최종 목적지까지 도달하여 문제에서 요구하는 조건을 만족하면


rotation함수를 돌리면서 만든 temp 배열리스트를 이용하여 ( 그간 지나온 index 저장해놓은 것 )


최종멤버(finMem) 배열에 체크해둔다.




 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {
	
	static int[] num;
	static boolean[] visited;
	static boolean[] finMem;
	static int last;
	static ArrayList<Integer> temp = new ArrayList<Integer>();
	static int res=0;
	
	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 N = Integer.parseInt(br.readLine());
		num = new int[N+1];
		visited = new boolean[N+1];
		finMem = new boolean[N+1];
		
		for(int i=1; i<=N; i++) {
			num[i]=Integer.parseInt(br.readLine());
		}
		
		for(int i=1; i<=N; i++) {
			temp.clear();
			last=i;	// 마지막 값은 시작한 index여야함. 
			rotation(i);
//			System.out.println(num[i]);
		}
		
		bw.write(Integer.toString(res)+"\n");
		for(int i=1; i<finMem.length; i++) {
			if(finMem[i]) bw.write(Integer.toString(i)+"\n");
		}
		bw.flush();
		bw.close();
		
		
	}
	public static void rotation (int i) {
		if(visited[i] || finMem[i]) return;
		visited[i]=true;
		
		temp.add(i);	// 꼬리 물면서 index 추가
		rotation(num[i]);
		
		visited[i]=false;
		// 꼬리 물어서 세트 만듬
		if(num[i]==last) {
			for(int j=0; j<temp.size(); j++) {
				finMem[temp.get(j)]=true;
				res++;
			}
		}
		
	}
	
}


'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준][Java] 2309번 일곱 난쟁이  (1) 2019.02.19
[백준][Java] 5597번 과제 안 내신 분..?  (0) 2019.02.13
[백준][Java] 2669번 직사각형 네개의 합집합의 면적 구하기  (0) 2018.05.19
[백준][Java] 2667번 단지번호붙이기  (0) 2018.05.19
[백준][Java] 9205번 맥주 마시면서 걸어가기  (0) 2018.05.19
'알고리즘 풀이/백준' 카테고리의 다른 글
  • [백준][Java] 2309번 일곱 난쟁이
  • [백준][Java] 5597번 과제 안 내신 분..?
  • [백준][Java] 2669번 직사각형 네개의 합집합의 면적 구하기
  • [백준][Java] 2667번 단지번호붙이기
배게
배게
배게
백엔드
배게
전체
오늘
어제
  • 분류 전체보기 (430)
    • 알고리즘 풀이 (338)
      • 백준 (167)
      • Codility (22)
      • 프로그래머스 (123)
      • LeetCode (2)
      • CodeForces (9)
      • SWEA (15)
    • 백엔드 (11)
    • Coding existing for (3)
    • 무지성 메모 (40)
    • Debug (30)
    • 자바 (8)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • MYSQL
  • 카톡
  • 카카오톡
  • hibernate
  • 카톡 내보내기한 파일 정렬
  • 카카오톡 txt파일 정렬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
배게
[백준][Java] 2668번 숫자고르기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.