n명의 사람들이 m개의 치즈를 나눠 먹었는데
1개의 치즈가 상해서 배탈이 났다.
k번째 사람이 q번째 치즈를 r 때 먹은 내용이 d번 주어지고
p번째 사람이 w때부터 아프기 시작한 내용이 s번 주어진다.
이때 필요한 약의 개수
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int d = sc.nextInt();
int s = sc.nextInt();
int [][] taken = new int[n][m]; // n번 사람이 m번 치즈를 몇초에 먹었는지
int [] ill = new int[n]; // n번째 사람이 언제 아프기 시작했는지
boolean [] spoil = new boolean[m]; // 치즈가 상했나요
for (int i = 0; i < d; i++){
int person = sc.nextInt() - 1;
int cheese = sc.nextInt() - 1;
int when = sc.nextInt();
if (taken[person][cheese] > 0)
taken[person][cheese] = Math.min(taken[person][cheese], when);
else
taken[person][cheese] = when;
}
for (int i = 0; i < s; i++){
int person = sc.nextInt() - 1;
int start = sc.nextInt();
ill[person] = start;
}
for (int i = 0; i < n; i++){ // 사람 넘버
if (ill[i] == 0)
continue;
for (int j = 0; j < m; j++){
if (taken[i][j] > 0 && taken[i][j] < ill[i])
spoil[j] = true;
}
}
// 한개만 상함
int max = -1;
for (int j = 0; j < m; j++){
if (!spoil[j])
continue;
boolean [] medicine = new boolean[n]; // 약먹어야하면 추가
boolean check = true;
for (int i = 0; i < n; i++){
if (ill[i] > 0){
if (taken[i][j] == 0 || ill[i] <= taken[i][j])
check = false;
}
if (taken[i][j] > 0)
medicine[i] = true;
}
int res = 0;
if (check){
for (boolean medi : medicine){
if (medi)
res++;
}
}
max = Math.max(res, max);
}
System.out.print(max);
}
}
spoiled[]는 필요 없을 것 같기도 함..
완전 탐색으로 치즈가 상했다고 생각되는 치즈들을 먹은 사람의 수 count
아프다고 주어진 정보에서 아픈 사람들이 모두 그 치즈를 먹었는지 체크
-> 상하다고 판단된 치즈인데 아픈 사람들이 모두 안먹으면 오류 처리