풀이
- 작업의 시작 시간, 종료 시간을 저장하기 위해
Work
클래스 사용
Work
를 저장하기 위해 ArrayList works
사용
- 어떠한 시각 기준으로 1초 동안 한 작업이 수행 중인지 여부를 계산하는
check()
메소드 사용
lines
를 순회하며 작업의 시작 시간과 종료 시간을 구하여 works
에 저장
works
를 순회하며 work
의 시작 시간, 종료 시간을 각각 기준으로 하여 1초 동안 수행 중인 작업들의 수를 check()
사용하여 계산
- 계산한 것중 가장 큰 값 반환
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public int solution(String[] lines) {
List<Work> works = new ArrayList<>();
for (String line : lines) {
String[] splitLine = line.split(" ");
double[] endTimeArr = Arrays.stream(splitLine[1].split(":"))
.mapToDouble(Double::parseDouble)
.toArray();
int endTime = 0;
for (int i = 0; i < 3; i++) {
endTime += (int) (endTimeArr[i] * Math.pow(60, 2 - i) * 1000);
}
int workTime = (int) (
Double.parseDouble(splitLine[2].substring(0, splitLine[2].length() - 1)) * 1000);
int startTime = endTime - workTime + 1;
works.add(new Work(startTime, endTime));
}
int max = 0;
for (Work work : works) {
int num1 = 0;
int num2 = 0;
for (Work compWork : works) {
if (check(work.getStartTime(), compWork)) {
num1++;
}
if (check(work.getEndTime(), compWork)) {
num2++;
}
}
if (Math.max(num1, num2) > max) {
max = Math.max(num1, num2);
}
}
return max;
}
public boolean check(int time, Work work) {
int startTime = work.getStartTime();
int endTime = work.getEndTime();
if (startTime >= time && startTime <= time + 999) {
return true;
} else if (endTime >= time && endTime <= time + 999) {
return true;
} else if (startTime < time && endTime > time + 999) {
return true;
}
return false;
}
}
class Work {
private final int startTime;
private final int endTime;
public Work(int startTime, int endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public int getStartTime() {
return startTime;
}
public int getEndTime() {
return endTime;
}
}