공부기록

광고 삽입 본문

코테/프로그래머스

광고 삽입

코타쿠 2021. 10. 5. 22:00

문제

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으로 바꿔주니 통과했다.
  • 경계값을 정확히 잡는 것, 그리고 자료형에 대한 고려를 했다면 오래 걸리지 않았을까 하는 아쉬움이 있다.

'코테 > 프로그래머스' 카테고리의 다른 글

98. Validate Binary Search Tree  (0) 2022.03.20
카드 짝 맞추기  (0) 2021.10.06
금과 은 운반하기  (0) 2021.10.02
표 편집  (0) 2021.09.30
입실 퇴실  (0) 2021.09.22