문제
해결 방법
처음에는 3차원 배열을 사용해서 play_num[시간][분][초] 에 해당하는 시간에 시청 중인 사람의 수를 기록하려고 했는데, 시분초를 계속 변환해줘야해서 상당히 귀찮았다. 그래서 초로 통합을 해서 값을 구하기로 하였다.
문제에서 시간은 hh:mm:ss 로 되어있어 :을 기준으로 split을 사용하여 나누어 주었고,
logs 같은 경우는 hh:mm:ss-hh:mm:ss 로 되어있어 -를 먼저 :로 바꾸어준다음에 :을 기준으로 split을 사용하여 나누었다.
그 뒤에 시작지점부터 끝지점까지 배열에 1을 추가해주었다.
마지막으로 0초부터 adv_time 만큼의 구간의 합을 구한 다음에 제일 앞의 배열을 빼고 제일 뒤에 배열을 한 칸씩 추가하는 투포인터 방식으로 각 시간마다의 합을 구한 다음에 최대값이면 그 값을 결과값으로 지정해주는 방식으로 탐색해나간다.
문제에서 같은 값이 있다면 가장 앞쪽의 값이 정답이라고 하였기 때문에 부등호를 사용할 때 if (sum > max) 로 사용했다.
초로 바뀌어있는 값을 다시 String으로 변경하는 것은 아래 블로그를 참고했다.
참고한 블로그 : wellbell.tistory.com/105
만약 시간이 10보다 작다면 앞에 0을 붙여 줘야해서 코드와 같은 식이 나왔다.
Ex) 9:12:13 일시 09:12:13 이어야함.
그리고 sum과 max를 long 타입으로 지정하지 않으면 17번 케이스에서 실패가 나온다.
질문란을 보고 알아서 수정했다.
코드
class Solution {
public String solution(String play_time, String adv_time, String[] logs) {
String answer = "";
String[] temp = play_time.split(":");
int[] play_num = new int[timeToSec(temp[0], temp[1], temp[2]) + 1];
for (int i = 0; i < logs.length; i++) {
logs[i] = logs[i].replaceAll("-", ":");
temp = logs[i].split(":");
int start = timeToSec(temp[0], temp[1], temp[2]);
int end = timeToSec(temp[3], temp[4], temp[5]);
for (int j = start; j < end; j++) {
play_num[j]++;
}
}
temp = adv_time.split(":");
int adv = timeToSec(temp[0], temp[1], temp[2]);
int sT = 0; // 시작시간
int eT = adv; // 종료시간
long sum = 0;
for (int i = sT; i < eT; i++) {
sum += play_num[i];
}
long max = sum;
int secAnswer = 0;
for (int i = 0; i < play_num.length - adv; i++) {
sum -= play_num[sT];
sum += play_num[eT];
if (sum > max) {
max = sum;
secAnswer = sT + 1;
}
sT++; // 시작시간을 한 칸 우측으로 이동
eT++; // 종료시간도 한 칸 우측으로 이동
}
return secondToStr(secAnswer);
}
static int timeToSec(String a, String b, String c) {
int h = Integer.parseInt(a);
int m = Integer.parseInt(b);
int s = Integer.parseInt(c);
int sec = 0;
sec += h * 3600;
sec += m * 60;
sec += s;
return sec;
}
static String secondToStr(int time) {
int hour = time / 3600;
time %= 3600;
int minute = time / 60;
int second = time % 60;
String strHour = hour > 9 ? String.valueOf(hour) : "0" + hour;
String strMinute = minute > 9 ? String.valueOf(minute) : "0" + minute;
String strSecond = second > 9 ? String.valueOf(second) : "0" + second;
return String.join(":", strHour, strMinute, strSecond);
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[JAVA] Programmers : 등산코스 정하기 (0) | 2022.09.07 |
---|---|
[JAVA] Programmers : 배달 (0) | 2022.05.02 |
[JAVA] Programmers : 피로도 (0) | 2022.05.02 |
[JAVA] 행렬 테두리 회전하기 (0) | 2021.05.03 |
[JAVA] 합승 택시 요금 (0) | 2021.04.29 |