본문 바로가기

백준

[백준] 27112 시간 외 근무 멈춰! [자바]

 

 


https://upload.acmicpc.net/30f339f9-285f-43ef-bdf1-6da563423866/

https://www.acmicpc.net/board/view/107317

 

글 읽기 - 제1회 보라매컵 예선 Open Contest 종료

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

※. 마감일이 빠른 작업부터 진행

 

※. 평시근무를 계산할 때 주말을 빼줘야한다. (토요일 day % 7 == 6, 일요일 day % 7 == 0)

 

※. 배열 10만, 마감일, 걸리는 시간도 10만이라 1~최대 마감일 로 반복문을 작성하면 더 쉽게 풀 수 있다.

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

class work implements Comparable<work>{
	int day;
	int time;
	work(int day, int time) {
		this.time = time;
		this.day = day;
	}
	public int compareTo(work n) {
		return Integer.compare(day, n.day);
	}
}
public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(br.readLine());
		ArrayList<work> list = new ArrayList<>();
		for(int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			list.add(new work(a,b));
		}
		Collections.sort(list);
		
		boolean answer = false;
		int useday = 0;
		int outday = 0;
		int weekday = 0;
		for(work wk : list) {
			weekday = (wk.day / 7) * 2;
			if(wk.day % 7 == 6) weekday++;
			
			int working = wk.day - useday - weekday;
			if(wk.time > working) {
				useday += working;
				int task = wk.time - working;
				int outwork = wk.day - outday;
				if(task > outwork) answer = true;
				
				outday += task;
			}
			else {
				useday += wk.time;
			}
		}
		
		if(answer)
			System.out.println(-1);
		else
			System.out.println(outday);
	}
}