문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/72414#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
슬라이딩 윈도우 기법을 이용하는 문제였습니다.
시스템 케이스 17번에서 거의 10초가 걸렸기 때문에 아슬아슬하게 통과한 코드입니다.
알고리즘은 아래와 같습니다.
1. 입출력 예 #2를 보면 01:00:00-11:00:00 : 해당 구간이 1회(2번 기록) 재생되었으므로 누적 재생시간은 10시간 00분 00초라고 주어집니다. 따라서, 주어진 광고의 범위는 사실상 [시작 시간 + 1초, 종료 시간]입니다.
2. 이 점을 유의하여 logs 벡터를 전 처리하여 arr 배열에 각 초마다 몇 개의 프로그램이 동시에 진행되고 있는지 기록합니다.
3. 슬라이딩 윈도우를 진행할 때 광고 삽입 시간을 업데이트하는 기준이 필요하므로 우선, [0초, ad_time초] 구간에서 광고가 총 몇 초동안 상영이 되는지 기록하고 answer를 "00:00:00"초로 지정합니다.
4. 1초씩 슬라이딩하면서 총 광고 상영시간을 체크하고 광고가 기존에 기록한 시간보다 더 오래 상영되었다면 answer를 업데이트합니다. (주의: 정답이 여러 개라면 가장 빠른 시간을 반환해야 하므로 반드시 기존에 기록한 시간보다 초과할 때만 업데이트합니다. 동등할 경우 업데이트 X)
5. 4번에서 구한 asnwer를 반환합니다.
#include <string> | |
#include <vector> | |
#include <iostream> | |
#include <algorithm> | |
#include <climits> | |
using namespace std; | |
const int MAX = 360000; | |
long long arr[MAX]; | |
int convertTimeToSeconds(string s) | |
{ | |
int hour = stoi(s.substr(0, 2)) * 3600; | |
int minute = stoi(s.substr(3, 2)) * 60; | |
int second = stoi(s.substr(6, 2)); | |
return hour + minute + second; | |
} | |
string convertSecondsToTime(int time) | |
{ | |
int hour = time / 3600; | |
int minute = (time % 3600) / 60; | |
int second = (time % 3600) % 60; | |
string result = (hour < 10 ? "0" + to_string(hour) : to_string(hour)) | |
+ ":" | |
+ (minute < 10 ? "0" + to_string(minute) : to_string(minute)) | |
+ ":" | |
+ (second < 10 ? "0" + to_string(second) : to_string(second)); | |
return result; | |
} | |
string solution(string play_time, string adv_time, vector<string> logs) { | |
if (play_time == adv_time) | |
{ | |
return "00:00:00"; | |
} | |
for (string log : logs) | |
{ | |
string start = log.substr(0, 8); | |
string end = log.substr(9, 8); | |
int startTime = convertTimeToSeconds(start); | |
int endTime = convertTimeToSeconds(end); | |
for (int t = startTime + 1; t <= endTime; t++) | |
{ | |
arr[t]++; | |
} | |
} | |
string answer = convertSecondsToTime(0); | |
int adTime = convertTimeToSeconds(adv_time); | |
long long watchTime = 0; | |
for (int t = 0; t <= adTime; t++) | |
{ | |
watchTime += arr[t]; | |
} | |
long long temp = watchTime; | |
int maxTime = convertTimeToSeconds(play_time); | |
for (int t = 1, t2 = adTime + 1; t2 <= maxTime; t++, t2++) | |
{ | |
temp -= arr[t]; | |
temp += arr[t2]; | |
if (temp > watchTime) | |
{ | |
answer = convertSecondsToTime(t); | |
watchTime = temp; | |
} | |
} | |
return answer; | |
} |

개발환경: Programmers IDE
지적, 조언, 질문 환영합니다! 질문 남겨주세요~
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 길 찾기 게임 (0) | 2022.07.26 |
---|---|
[Programmers] 기둥과 보 설치 (0) | 2022.07.21 |
[Programmers] 몸짱 트레이너 라이언의 고민 (1) | 2022.07.18 |
[Programmers] 보행자 천국 (0) | 2022.07.15 |
[Programmers] 경주로 건설 (0) | 2022.07.13 |