끄적끄적 코딩
article thumbnail
728x90

이분매칭 문제입니다.

열혈강호2와 유사한 문제입니다.
https://j3sung.tistory.com/1019

 

[Java] 백준 11376번 열혈강호2

이분 매칭으로 문제를 해결하였습니다. N명의 직원이 있고 해야할 일이 M개가 있을 때 직원들이 할 수 있는 일들이 정해져있고 두개의 일만 할 수 있습니다. 이 때 일을 잘 분배해서 가장 많이 할

j3sung.tistory.com


상어가 속도, 사이즈, 지능이 주어질 때 다른 상어의 속도, 사이즈, 지능이 전부 같거나 작을 때 먹을 수 있습니다.
최대 2마리 까지 먹을 수 있으며 서로 먹고 먹힐 수는 없습니다.

이분매칭을 사용해서 상어들을 매칭해줍니다.
매칭 할 때 eat함수를 사용해서 해당 상어를 먹을 수 있는지 확인합니다.
먹을 수 있으면 해당 상어를 점유(먹으려고 한 상어가 있는지)한 상어가 있는지 확인합니다.
점유한 상어가 다른 상어를 먹을 수 있는지 (양보가 가능한지) 확인하고 가능하면 해당 상어를 점유합니다.
위의 과정을 반복해서 문제를 해결하였습니다.

유의해야하는 사항으로는 서로 먹고 먹힐 수 없으므로, 먹고 먹히는 경우는 3개의 능력치가 같은 경우입니다.
1번 상어 : 1 1 1
2번 상어 : 1 1 1
3번 상어 : 1 1 1
위의 경우 세마리의 상어가 서로 먹고 먹힐 수 있습니다.
이를 방지해주기 위해서 능력치가 같을 경우 인덱스를 비교해서 인덱스가 큰 상어만 작은 상어를 먹을 수 있도록 해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	static int ans;
	static int n;
	static int visitCnt;
	static Data[] sharks;
	static int visit[];
	static int eat[];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());

		ans = 0;
		n = Integer.parseInt(st.nextToken());
		sharks = new Data[n + 1];
		visit = new int[n + 1];
		eat = new int[n + 1];

		for (int i = 1; i <= n; ++i) {
			st = new StringTokenizer(br.readLine());
			int size = Integer.parseInt(st.nextToken());
			int speed = Integer.parseInt(st.nextToken());
			int brain = Integer.parseInt(st.nextToken());
			sharks[i] = new Data(size, speed, brain);
		}

		for (int i = 1; i <= n; ++i) {
			++visitCnt;
			if (DFS(i) == 1) {
				++ans;
			}
			++visitCnt;
			if (DFS(i) == 1) {
				++ans;
			}
		}

		bw.write(n - ans + "\n");
		bw.close();
	}

	public static int DFS(int loc) {
		if (visit[loc] == visitCnt) {
			return 0;
		}
		visit[loc] = visitCnt;

		for (int i = 1; i <= n; ++i) {
			if (loc == i) {
				continue;
			}

			if (eat(loc, i)) {
				if (eat[i] == 0 || DFS(eat[i]) == 1) {
					eat[i] = loc;
					return 1;
				}
			}
		}

		return 0;
	}

	public static boolean eat(int a, int b) {
		if (sharks[a].size == sharks[b].size && sharks[a].speed == sharks[b].speed && sharks[a].brain == sharks[b].brain
				&& a < b) {
			return false;
		}

		if (sharks[a].size >= sharks[b].size && sharks[a].speed >= sharks[b].speed && sharks[a].brain >= sharks[b].brain) {
			return true;
		}

		return false;
	}

	public static class Data {
		int size;
		int speed;
		int brain;

		public Data(int size, int speed, int brain) {
			this.size = size;
			this.speed = speed;
			this.brain = brain;
		}
	}
}

'알고리즘' 카테고리의 다른 글

[Java] 백준 1726번 로봇  (0) 2023.06.16
[Java] 백준 2056번 작업  (0) 2023.04.14
[Java] 백준 11378번 열혈강호4  (0) 2023.04.10
[Java] 백준 11377번 열혈강호3  (0) 2023.04.10
[Java] 백준 11376번 열혈강호2  (0) 2023.04.10

검색 태그