공부기록
광고 삽입 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/72414
코드
class Solution {
int makeIntTime(String time){
int hours = (time.charAt(0)-'0')*10+(time.charAt(1)-'0');
int minutes = (time.charAt(3)-'0')*10+(time.charAt(4)-'0');
int seconds = (time.charAt(6)-'0')*10+(time.charAt(7)-'0');
return hours*60*60 + minutes*60 + seconds;
}
String timeToStr(int time){
String hs = Integer.toString(time/(60*60));
hs = hs.length() == 1 ? ("0" + hs) : hs;
String ms = Integer.toString((time%(60*60))/60);
ms = ms.length() == 1 ? ("0" + ms) : ms;
String ss = Integer.toString(time%60);
ss = ss.length() == 1 ? ("0" + ss) : ss;
return hs + ":" + ms + ":" + ss;
}
public String solution(String play_time, String adv_time, String[] logs) {
String answer = "";
long max_val = 0;
int ans_t = 0;
long pre[] = new long[100*60*60];
int pt = makeIntTime(play_time);
int advt = makeIntTime(adv_time);
if(pt <= advt)
return "00:00:00";
for(String log : logs){
String[] times = log.split("-");
pre[makeIntTime(times[0])]++;
pre[makeIntTime(times[1])]--;
}
for(int i=0; i<pt; i++)
if(i == 0) continue;
else pre[i] += pre[i-1];
for(int i=0; i<pt; i++)
if(i == 0) continue;
else pre[i] += pre[i-1];
for(int i=0; i<pt; i++){
if(i+advt > pt)
break;
if(i == 0){
max_val = pre[advt-1];
ans_t = 0;
}else{
long cur_val = pre[i+advt-1] - pre[i-1];
if(max_val < cur_val){
ans_t = i;
max_val = cur_val;
}
}
}
answer = timeToStr(ans_t);
return answer;
}
}
피드백
- 문자열 파싱 + 누적합 문제였다.
- 누적합 부분이 개인적으로 좀 신박했는데, 결론적으로 2번 누적했을 해줘야 했던 문제였다.
- 일단 구간별로 몇 명이 보고있는지 집계하기 위해 누적합을 처음 썻다.
- 그러면 시간별로 보고 있는 사람이 나온다.
- 이제 시간별로 지금까지의 누적 재생시간을 집계하기 위해 다시 누적합을 한다.
- 까다로웠던 부분은 먼저 정확하게 경계값을 따지는 것이었다.
pre[0]
의 뜻은 0~1초간 누적 재생시간이다.pre[k]
의 뜻은 0~k+1 초간 누적 재생시간이 된다.- 그러니까, N~M 까지의 누적 시간을 따지려면
pre[M-1] - pre[N-1]
이 되는 것이다.
- 그 다음 까다로웠던 부분은 자료형의 범위를 고려하는 것이었다.
- 17번 테케에서 계속해서 에러가 났다.
- 결국
질문하기
를 보니, 자료형을Long
으로 바꿔주면 된다는 것이었다 (64bit 정수). - 생각을 해보니, 초 당 최대 누적 재생시간은 300000이다. 그러면 1000초 정도 되면
int
형 범위를 넘어가게 되니 (약 2,000,000,000) 문제가 발생한다. pre[]
를Long
으로 바꿔주니 통과했다.
- 경계값을 정확히 잡는 것, 그리고 자료형에 대한 고려를 했다면 오래 걸리지 않았을까 하는 아쉬움이 있다.