728x90
반응형
2024.07.06기준 - 실버2
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 일을 끝내야 되는 날짜와 그 일을 하기 위해 들이는 시간이 주어졌을 때 야근을 하는 횟수를 출력하는 문제입니다.
1. 작업기간과 작업시간을 저장하는 배열을 생성 후 빨리 끝내야 되는 일부터 정렬을 해주었습니다.
Integer[][] arr = new Integer[n][2];
int day, time;
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
day = Integer.parseInt(st.nextToken()); // 작업 기간
time = Integer.parseInt(st.nextToken()); // 작업 시간
arr[i][0] = day;
arr[i][1] = time;
}
// 빨리 끝내야 되는 일부터 정렬.
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]);
2. 정렬된 배열을 이용해 얼마나 야근을 해야되는지 구현을 해주었습니다. (추가 설명 하단)
int over = 0; // 야근 횟수
int work = 0; // 현재 까지 할 수 있는 업무의 시간
int now = 0; // 현재 날짜
for (int i = 0; i < n; i++) {
day = arr[i][0];
work += day - now - holiday(now + 1, day);
now = day;
work -= arr[i][1];
if (work < 0) {
over += Math.abs(work);
work = 0;
}
if (over > now) {
over = -1;
break;
}
}
- now는 현재 날짜를 뜻하게 되며, 배열에서 나오는 작은 날짜 순으로 올라가게 됩니다.
- 현재 날짜에서 다음 날짜까지의 차는 업무 중 일을 할 수 있는 횟수가 되며, 그 중 주말을 제외해주며 work를 올려줍니다.
- 그러고 그 날까지 해야되는 업무의 시간을 빼주며 work가 음수가 된다면 그 만큼 야근을 했다는 소리가 됩니다.
- 야근을 했는 데 하루에 1번 밖에 일을 못하기 때문에 현재 날짜 보다 야근 횟수가 많아지면 일을 다 끝내지 못해 -1을 출력하게 됩니다.
- 만약 모든 일을 처리하게 되면 야근(over)의 횟수를 출력하게 됩니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // 작업의 개수
Integer[][] arr = new Integer[n][2];
int day, time;
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
day = Integer.parseInt(st.nextToken()); // 작업 기간
time = Integer.parseInt(st.nextToken()); // 작업 시간
arr[i][0] = day;
arr[i][1] = time;
}
// 빨리 끝내야 되는 일부터 정렬.
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]);
int over = 0; // 야근 횟수
int work = 0; // 현재 까지 할 수 있는 업무의 시간
int now = 0; // 현재 날짜
for (int i = 0; i < n; i++) {
day = arr[i][0];
work += day - now - holiday(now + 1, day);
now = day;
work -= arr[i][1];
if (work < 0) {
over += Math.abs(work);
work = 0;
}
if (over > now) {
over = -1;
break;
}
}
bw.write(Integer.toString(over));
bw.flush();
bw.close();
br.close();
}
// 토, 일을 제외
private static int holiday(int start, int end) {
int count = 0;
for (int i = start; i <= end; i++) {
if (i % 7 == 6 || i % 7 == 0) {
count++;
}
}
return count;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31907번 GIST 찍기 (0) | 2024.07.07 |
---|---|
BAEKJOON / 백준 - JAVA 31880번 K512컵 개최! (0) | 2024.07.06 |
BEAKJOON / 백준 - JAVA 25327번 다중 항목 선호도 조사 (Large) (0) | 2024.07.05 |
BAEKJOON / 백준 - JAVA 1652번 누울 자리를 찾아라 (0) | 2024.07.05 |
BAEKJOON / 백준 - JAVA 1021번 회전하는 큐 (0) | 2024.07.04 |