투로드
Coder ToLoad
투로드
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 알고리즘
  • CS
  • GITHUB
  • 태그
  • 분류 전체보기 (69)
    • Toy Project (0)
      • EternalSNS (0)
    • Algorithm (46)
      • BaekJoon (38)
      • Programmers (7)
      • Code Tree (1)
    • Computer Science (13)
      • JAVA (7)
      • DataBase (4)
    • Backend (7)
      • Spring (2)
      • JPA (2)
      • Django (3)
    • Mobile (2)
      • Android (2)
    • Unity (1)

인기 글

최근 글

hELLO · Designed By 정상우.
투로드

Coder ToLoad

Algorithm/Programmers

[JAVA] 광고 삽입

2021. 5. 1. 12:20
문제
 

코딩테스트 연습 - 광고 삽입

시간을 나타내는 HH, H1, H2의 범위는 00~99, 분을 나타내는 MM, M1, M2의 범위는 00~59, 초를 나타내는 SS, S1, S2의 범위는 00~59까지 사용됩니다. 잘못된 시각은 입력으로 주어지지 않습니다. (예: 04:60:24, 11

programmers.co.kr

해결 방법

처음에는 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
    'Algorithm/Programmers' 카테고리의 다른 글
    • [JAVA] Programmers : 배달
    • [JAVA] Programmers : 피로도
    • [JAVA] 행렬 테두리 회전하기
    • [JAVA] 합승 택시 요금
    투로드
    투로드
    훌륭한 프로그래머가 되어가는 과정을 담아보는 중입니다.

    티스토리툴바