본문 바로가기

알고리즘/백준

[JAVA]백준_15566_개구리1

문제 : https://www.acmicpc.net/problem/15566

 

15566번: 개구리 1

연못 안에 개구리들이 있을 수 있는 연꽃 N개와, 연꽃 사이를 연결하는 다리 역할의 통나무 M개가 있다. 같은 연꽃 쌍을 연결하는 통나무의 개수는 1개 이하이다. 여기에 N마리의 개구리가 각각 ��

www.acmicpc.net

 

문제 유형 : 순열, 시뮬레이션

 

풀이 방식 :

Step 1. 먼저 개구리가 선호하는 연꽃으로 연꽃-개구리 순열을 만든다

Step 2. 순열이 완성되면 연꽃이 연결된 통나무(연꽃1, 연꽃2)에 맞는 개구리 흥미도를 비교 

Step 3. 조건이 완성되면 연꽃 순열을 StringBuilder에 append 해준 후 boolean형 result=true 해준 후 return 시킨다

 

 

소스 코드

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_15566_개구리1_Main {

	private static int N;
	private static int M;
	private static List<Integer> frog_lotus[];
	private static int[] lotus;
	private static int[][] log;
	private static boolean result;
	private static int[][] frog;
	private static StringBuilder sb;

	public static void main(String[] args) throws IOException  {
		// 1. 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		frog = new int[N][4]; // 개구리의 흥미도
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine()," ");
			for (int j = 0; j < 4; j++) {
				frog[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		frog_lotus = new ArrayList[N]; // 개구리의 선호 연꽃
		for (int i = 0; i < N; i++) {
			frog_lotus[i] = new ArrayList<Integer>();
		}
		
		// 1-1. 선호하는 연꽃이 같을경우 한번 넣어줌
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine()," ");
			int A = Integer.parseInt(st.nextToken())-1;
			int B = Integer.parseInt(st.nextToken())-1;
			if(A==B) {
				frog_lotus[i].add(A);
			}else {
				frog_lotus[i].add(A);
				frog_lotus[i].add(B);
			}
		}
		
		log = new int[M][3]; // 통나무 정보
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine()," ");
			for (int j = 0; j < 3; j++) {
				log[i][j] = Integer.parseInt(st.nextToken())-1;
			}
		}
		
		
		lotus = new int[N];
		Arrays.fill(lotus, -1);
		result = false;  // 답확인을 위한 boolean 변수
		sb = new StringBuilder();
		
		// 2. 순열
		permutation(0);
		
		// 3. 답 출력
		if(result) {
			System.out.println(sb.toString());
		}else System.out.println("NO");
		
		
	}

	private static void permutation(int cnt) {
		if(cnt==N) {
			boolean flag = true;
			for (int i = 0; i < M; i++) {
				int ycc1 = log[i][0];
				int ycc2 = log[i][1];
				int title = log[i][2];
				
				int frog1 = lotus[ycc1];
				int frog2 = lotus[ycc2];
				
				if(frog[frog1][title]!=frog[frog2][title]) {
					flag = false;
					break;
				}
				
			}
			
			if(flag) {
				result = true;
				sb.append("YES\n");
				for (int i = 0; i < N; i++) {
					sb.append((lotus[i]+1)+" ");
				}
			} 
			return;
		}
		
		if(result) return;
		for (int i = 0; i < frog_lotus[cnt].size(); i++) {
			int ycc = frog_lotus[cnt].get(i);
			if(lotus[ycc]==-1) {
				lotus[ycc] = cnt;
				permutation(cnt+1);
				if(result) return;
				lotus[ycc] = -1;
			}
		}
		
	}

	

}

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

[JAVA]백준_19637_IF문좀대신써줘  (0) 2020.09.22
[JAVA]백준_2643_색종이올려놓기  (0) 2020.09.01
[JAVA]백준_19563_개구리1  (0) 2020.08.26
[JAVA]백준_1463_1로만들기  (0) 2020.08.21
[JAVA]백준_9375_패션왕 신해빈  (0) 2020.08.20