[코드트리] 상해버린 치즈

h_jin·2025년 1월 6일

코테

목록 보기
4/33

문제 링크

문제

n명의 사람들이 m개의 치즈를 나눠 먹었는데
1개의 치즈가 상해서 배탈이 났다.
k번째 사람이 q번째 치즈를 r 때 먹은 내용이 d번 주어지고
p번째 사람이 w때부터 아프기 시작한 내용이 s번 주어진다.
이때 필요한 약의 개수

틀렸던 이유

  • 1개의 치즈라는 걸 인지 못하고 p번째 사람이 아프기 전에 먹은 모든 치즈가 상했다고 가정
  • 치즈를 중복으로 먹는걸 인지 못함 -> 나중에 들어온 값으로 업데이트 (특정 치즈를 먹고 아픈걸 제대로 체크 못함)

풀이

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
아프다고 주어진 정보에서 아픈 사람들이 모두 그 치즈를 먹었는지 체크
-> 상하다고 판단된 치즈인데 아픈 사람들이 모두 안먹으면 오류 처리

0개의 댓글