Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- java
- DP
- kotlin
- lambda
- BFS
- 자바
- 코틀린
- 모던자바
- LEVEL2
- Spring
- 운영체제
- OS
- 스프링
- 네트워크
- 프로그래머스
- 그래프
- baekjoon
- 알고리즘
- Brute-force
- Java8
- TDD
- programmers
- algorithm
- 백트래킹
- 프로젝트
- DFS
- 자료구조
- 백준
- backtracking
- back-end
Archives
- Today
- Total
요깨비's LAB
[백준, DFS, JAVA] P.2668 숫자 고르기 본문
이번에도.. 오지게 오래 걸렸습니다... 순수 완벽하게 푼것이 아닌.. 백준 질문하기에서 반례들을 이용하면서 풀었구요..
아직도 분기 처리 조건 생각하는거랑 로직을 제대로 생각 않하고 무작정 문제에 돌입하는 것... 참 안고쳐집니다. 좀만
풀이가 생각날 것 같으면 무조건 키보드에 손이 올라가는 이 흑우.. 처음 아이디어는 자료구조 Set 2개를 이용해서 DFS를 돌면서
각 방문 노드들을 Set에 넣어주면서 indexSet(첫째 줄 배열)이랑 valueSet(두번째 줄 배열)에 값들을 비교하면서 하려고 했는데
빛 좋은 개살구 마냥 아이디어만 좋았지 실제적으로 제 머리가 그걸 구현할 정도로 호환이 안되더군요.. 다음번에 다시 도전해서
올리겠습니다. 그냥 함수 재귀를 이용해서 풀었습니다.
여기에서 통과 조건은
- Root값(시작값)과 첫번째 줄에서 가리키는 값이 같을 경우입니다.
실패 조건은
- 첫번째 줄에서 가리키는 값이 이미 방문한 값인 경우입니다.
결국에는 첫번째줄에서 가리키는값(두번째줄의 index로 활용) -> 두번째줄에서 가리키는값(첫번째줄의 index로 활용) -> ...
의 과정을 거쳐 Root값(시작값)과 일치하느냐인지를 찾는 것 같습니다.
코드입니다.
import java.util.Scanner;
public class Main {
public static int N;
public static int[] arr;
public static boolean[] visited;
public static int[] resultList;
public static int result = 0;
public static void main(String[] args) {
Scanner scr = new Scanner(System.in);
N = scr.nextInt();
arr = new int[101];
visited = new boolean[101];
for (int i = 1; i <= N; i++) {
arr[i] = scr.nextInt();
}
for (int i = 1; i <= N; i++) {
if (visited[i])
continue;
visited[i] = true;
if (!dfs(i, arr[i])) {
visited[i] = false;
} else {
visited[i] = true;
}
}
for (int i = 1; i <= N; i++) {
if (visited[i])
result++;
}
System.out.println(result);
for (int i = 1; i <= N; i++)
if (visited[i])
System.out.println(i);
}
public static boolean dfs(int root, int index) {
if (arr[index] == root) {
visited[index] = true;
return true;
}
if (visited[index])
return false;
visited[index] = true;
if (!dfs(root, arr[index])) {
visited[index] = false;
return false;
} else {
return true;
}
}
}
아직도 분기 조건을 주는 것과 재귀시키는 부분에서 머리가 너무 안돌아 갑니다.. 끊임없이 훈련해서 현실에서는 이성적으로 개발에서는
기계적으로 생각할주 아는 유연한 개발자가 되도록 꾸준히 노력해야겠습니다.
'알고리즘(Java) > BFS&DFS' 카테고리의 다른 글
[백준, BFS, Java] P.2146 다리 만들기 (0) | 2021.09.20 |
---|---|
[백준, BFS, Java] P.2638 치즈 (0) | 2021.08.31 |
[백준, DFS, JAVA] P11725. 트리의 부모 찾기 (0) | 2020.10.07 |
[백준, Graph, JAVA] P.11403 경로찾기 (0) | 2019.12.11 |
[백준, BFS, JAVA] P.1707 이분 그래프 (0) | 2019.12.05 |
Comments