

사용한 자료구조 : 그래프
사용한 알고리즘 : DFS를 사용한 사이클 찾기
오랜시간끝에 이해한 결과..
[8, 6, 3, 7, 2, 5, 1, 4] 의 카드들이 있을때,
결국 1번박스에는 [1, 4, 7, 8]의 카드 4장이 있다.
다음으로 2번인덱스로 접근하여 숫자를 확인한다.
이 작업들을 계속 반복하다보면
1번 박스 : [1, 4, 7, 8] 4장의 카드
2번 박스 : [2, 5, 6] 3장의 카드
3번 박스 : [3] 1장의 카드
() 안의 숫자는 이미 방문한 적이 있는 숫자
8 -> 4 -> 7 -> 1 -> (8)
6 -> 5 -> 2 -> (6)
3
1번 박스 : 4장
2번 박스 : 3장
4 3 12
List<Integer> boxes = new ArrayList<>();
boolean[] visited = new boolean[cards.length];
for (int i = 0; i < cards.length; i++) {
if (!visited[i]) {
int size = 0;
int cur = i;
while (!visited[cur]) {
visited[cur] = true;
cur = cards[cur] - 1;
size++;
}
boxes.add(size);
}
}
박스 갯수가 1개일수도 있으니..if (boxes.size() < 2) {
return 0;
}
boxes.sort(Collections.reverseOrder());
return boxes.get(0) * boxes.get(1);
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public int solution(int[] cards) {
List<Integer> boxes = new ArrayList<>();
boolean[] visited = new boolean[cards.length];
for (int i = 0; i < cards.length; i++) {
if (!visited[i]) {
int size = 0;
int cur = i;
while (!visited[cur]) {
visited[cur] = true;
cur = cards[cur] - 1;
size++;
}
boxes.add(size);
}
}
if (boxes.size() < 2) {
return 0;
}
boxes.sort(Collections.reverseOrder());
return boxes.get(0) * boxes.get(1);
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] cards = {8, 6, 3, 7, 2, 5, 1, 4};
System.out.println(sol.solution(cards));
}
}

추가적으로 재귀적으로 문제를 접근해서 풀수 있지 않을까 생각했다.
재귀적으로 문제를 접근하면, 스택 오버플러우(Stack Overflow) 가 발생하기 쉬워서 오류가 일어날수 있지만, 해당문제는 데이터량이 그렇게 크지 않은것 같아서 재귀구현 연습하는겸, 시도해보았다.
스택 오버플로우(Stack Overflow)
- 스택은 함수호출, 지역 변수 저장 등에 사용되는 메모리 영역
- 재귀호출이 너무 깊어지면(많아지면) 메모리가 부족해질수 있음
- 스택 메모리가 한계를 초과하게 되면 오류가 발생을 함
재귀가 너무 취약한 나는 모든것이 취약하지만.. 재귀적으로 구현을 시도해 보았다.
public int dfs (int[] cards, boolean[] visited, int cur) {
if (visited[cur]) {
return 0;
}
visited[cur] = true;
int next = cards[cur] - 1;
return 1 + dfs(cards, visited, next);
}
for (int i = 0; i < cards.length; i++) {
if (!visited[i]) {
int size = dfs(cards, visited, i);
boxes.add(size);
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public int dfs (int[] cards, boolean[] visited, int cur) {
if (visited[cur]) {
return 0;
}
visited[cur] = true;
int next = cards[cur] - 1;
return 1 + dfs(cards, visited, next);
}
public int solution(int[] cards) {
boolean[] visited = new boolean[cards.length];
List<Integer> boxes = new ArrayList<>();
for (int i = 0; i < cards.length; i++) {
if (!visited[i]) {
int size = dfs(cards, visited, i);
boxes.add(size);
}
}
boxes.sort(Collections.reverseOrder());
if (boxes.size() < 2) {
return 0;
}
return boxes.get(0) * boxes.get(1);
}
