문제 풀이/백준
[Java] 백준 6068 - 시간 관리하기
gnoJJ
2022. 5. 20. 23:25
https://www.acmicpc.net/problem/6068
6068번: 시간 관리하기
성실한 농부 존은 시간을 효율적으로 관리해야 한다는 걸 깨달았다. 그는 N개의 해야할 일에 (1<=N<=1000) 숫자를 매겼다. (우유를 짜고, 마굿간을 치우고, 담장을 고치는 등의) 존의 시간을 효율적
www.acmicpc.net
해결방법 및 풀이
https://study-it-all.tistory.com/14
위 링크를 참조해주세요.
java는 2차원 배열 대신 객체 배열을 이용해서 풀이를 했습니다.
코드
import java.util.Scanner;
class Work{
int time; //일하는 데에 걸리는 시간
int deadline; //마감시간
Work(int t, int d){
this.time = t;
this.deadline = d;
}
}
public class Main {
public static void main(String[] args){
Scanner sc= new Scanner(System.in);
// 일의 개수 works
int works = sc.nextInt();
// 일에 대한 정보를 담을 Work 클래스 객체들.
Work task[] = new Work[works];
// 객체 배열의 각 원소마다 초기화 및 선언.
for (int i=0; i<works; i++){
int t = sc.nextInt();
int d = sc.nextInt();
task[i] = new Work(t,d);
}
// 객체배열의 데드라인을 기준으로 정렬중.
for (int i=0; i<works-1; i++){
for (int k=i+1; k<works; k++){
if (task[i].deadline > task[k].deadline){
Work tmp = task[i];
task[i] = task[k];
task[k] = tmp;
}else if (task[i].deadline == task[k].deadline){
if (task[i].time > task[k].time){
Work tmp = task[i];
task[i] = task[k];
task[k] = tmp;
}
}
}
}
int start = task[0].deadline - task[0].time;
int t = start;
ForCheck : while (t >= 0){
boolean all_suc = true;
Loop : for (int i=0; i<works; i++){
// 만약 늦잠을 start 만큼 잤을 때, 일을 제떄 못 끝내면?
// 늦잠잘 시간을 한 시간 빼고 다시 돌려보기
// 부가적으로 start를 t로 초기화.
// 정답인 양 출력 안되게 all_suc = false로 변경.
// 쓸데없는 반복 없애려 loop break
if (start + task[i].time > task[i].deadline){
t -= 1;
start = t;
all_suc = false;
break Loop;
}
//start + task[i].time <= task[i].deadline 인 경우.
start += task[i].time;
}
// for문에 대해 모든 순회를 통과를 했다면?
// t를 출력하면 된다.
if (all_suc){
System.out.println(t);
break ForCheck;
}
}
if (t < 0){
System.out.println(-1);
}
}
}