-
[알고리즘] 알고스팟 소풍 PICNIC프로그래밍/알고리즘 2019. 3. 22. 15:24
알고스팟 소풍 PICNIC
백트래킹으로 문제를 해결하였다.
보통 이런식으로 모든 방법의 수를 구하는 방법은 백트래킹으로 구하는 경우가 많은 것 같다.
이와 반대로 가장 먼저 도달하는 방법을 구하는 경우는 BFS가 많은 것 같은데... 이것도 더 익숙해져서 문제를 바로바로 어떤식으로 풀지 머릿 속에 나올 정도가 됐으면 좋겠다....먼저 친구관계를 저장해줄
friends
라는 이차원boolean
배열을 만들어서 친구관계를 저장하였고, 짝이 정해졌는 지 확인해줄visited
라는boolean
배열도 만들어 주었다.이 후 재귀함수를 만들어서 아직 짝이 없는 친구들을 짝을 주어지는 식으로 백트래킹을 해줬다.
구현 코드는 아래와 같다.
/** * https://algospot.com/judge/problem/read/PICNIC * 알고스팟 피크닉 PICNIC */ public class Picnic { static BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); static int N = 0; static int M = 0; static int count = 0; static boolean[][] friends; static boolean[] visited; public static void main(String[] args) throws IOException { int C = Integer.parseInt(br.readLine().trim()); while(C-->0){ count= 0; solution(); System.out.println(count); } } private static void solution() throws IOException { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); friends = new boolean[N][N]; visited = new boolean[N]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < M; i++) { int person1 = Integer.parseInt(st.nextToken()); int person2 = Integer.parseInt(st.nextToken()); friends[person1][person2] = true; friends[person2][person1] = true; } dfs(); } private static void dfs() { int person = findNotQueue(); if(person<0){ count++; return; } for (int i = 0; i < N; i++) { if(i == person) continue; if(friends[person][i] && !visited[i]){ visited[person] = true; visited[i] = true; dfs(); visited[person] = false; visited[i] = false; } } } private static int findNotQueue() { for (int i = 0; i < N; i++) { if(!visited[i]) return i; } return -1; } }
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[ 알고리즘 ] 백준 1918번 후위표기식 (0) 2019.05.02 [알고리즘] 백준 2667번 단지번호붙이기 ( BFS ) (0) 2019.03.26 [알고리즘] 알고스팟 BOARDCOVER 게임판 덮기 문제 (0) 2019.03.22 [알고리즘] DP 다이내믹 프로그래밍 Dynamic Programming (0) 2019.01.09 [알고스팟] RUNNING MEDIAN 알고리즘 풀이(?) (0) 2018.12.31