프로그래머스 2021 KAKAO BLIND RECRUITMENT Level 3 문제 광고 삽입을 Java를 이용해 풀어보았다. 풀진 못했고 그냥 풀이 보고 허망했다. 어떻게 저 생각을 시험 당시에 시간 압박까지 느끼며 풀지....? 그냥... 남의 풀이를 구경했다 ㅎㅎ.. 아따 나만 빼고 다덜 똑똑하누..
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/72414
문제에서 최대 시간을 99:59:59
로 제한해놨기 때문에 1초 단위로 싹 바꾸면 0
초부터 359,999
초까지 나온다. 즉, 36만개가 최대기 때문에 일차원 배열로 처리해서 풀면 된다. 몇 초에 몇 명이 봤는지 int[] visited
정보로 표현해서 겹치는 부분의 최댓값을 갱신하면 된다.
이 풀이를 대체 어떻게 생각하지? 하지만 생각을 할 수 있으면 쉬운 것 같긴 하다. 하지만 생각을 떠올릴 수 없기 때문에 아무런 의미는 없다. 어쩌라는 거지
별로 추가적인 설명을 달고 싶지 않은 문제다...
한계를 느낀다.. 띱..
아래는 내가 제출한 코드다.
public class AdPlacement {
static String solution(String play_time, String adv_time, String[] logs) {
int playTime = timeToSeconds(play_time);
int advTime = timeToSeconds(adv_time);
if(playTime==advTime) return "00:00:00";
int[] visited = new int[playTime+1];
for(String log: logs){
String[] times = log.split("-");
int start = timeToSeconds(times[0]);
int end = timeToSeconds(times[1]);
for(int i=start; i<end; i++)
visited[i]++;
}
/** 초기값 세팅 */
int start = 0;
int end = advTime;
long sum = 0;
for(int i=start; i<end; i++)
sum += visited[i];
/** 최대 누적 구간의 시작점 찾기 */
long max = sum;
long maxStart = start;
while(end<=playTime){
sum -= visited[start];
sum += visited[end];
if(sum>max){
max = sum;
maxStart = start + 1;
}
start++;
end++;
}
return secondsToTime(maxStart);
}
static Integer timeToSeconds(String time){
String[] split = time.split(":");
int hrs = Integer.parseInt(split[0]);
int mins = Integer.parseInt(split[1]);
int secs = Integer.parseInt(split[2]);
return hrs*3600 + mins*60 + secs;
}
static String secondsToTime(long seconds){
int hrs = (int)seconds / 3600;
int rest = (int)seconds % 3600;
int mins = rest / 60;
rest %= 60;
int secs = rest;
return String.format("%02d:%02d:%02d", hrs, mins, secs);
}
public static void main(String[] args) {
String play_time = "02:03:55";
String adv_time = "00:14:15";
String[] logs = { "01:20:15-01:45:14", "00:40:31-01:00:00", "00:25:50-00:48:29", "01:30:59-01:53:29", "01:37:44-02:02:30" };
String answer = solution(play_time, adv_time, logs);
System.out.println(answer);
}
}
오늘 배운 것
코테는 사람을 슬프게 만든다
HH:mm:ss 형식을 초 단위로 바꾸는 건 이제 익숙해서 떠올릴 수 있었지만, 최대 누적 재생 구간을 구하는 건 정말... 또 저번에 풀었던 풀이를 더 개선해보겠다고 개뻘짓하다가 결국 gg치고 저번에 통과한 내 풀이를 다시 보니 한숨만 나온다. 이걸 어떻게 생각하냐고 제발...
하지만 또 잘 생각해보면 기껏해봐야 100시간을 초로 바꿔봤자 36만밖에 안 되니까 떠올릴 법하다는 생각도.. 들기도 하나..? 구현은 어렵다....ㅠ