본문 바로가기
coding/algorithm

[programmers] Lv.3 추석 트래픽(c++)

by 눈부신음표 2022. 4. 25.
728x90

다시 한번 풀기

 

더보기
#include <bits/stdc++.h>

using namespace std;

pair<long, long> time_difference(string s, int t){
    long t_sec = 0;
    
    istringstream iss(s);
    string buff;
    int i = 2;
    while(getline(iss, buff, ':')){
        buff.erase(remove(buff.begin(), buff.end(), '.'), buff.end());
        t_sec += pow(60, i)*stoi(buff);
        if(i==1) t_sec *= 1000;
        i--;
    }
    
    return {t_sec - t + 1, t_sec};
}

vector<pair<long, long>> logs;

int compute(long start, long end){
    int cnt = 0, idx = 0;
    while(true){
        long log_start = logs[idx].first;
        long log_end = logs[idx].second;
        if(end >= log_start && start <= log_end) {
            cnt++;
        }

        idx++;
        if(idx == logs.size()) break;
    }
    
    return cnt;
}

int solution(vector<string> lines) {
    
    for(string line : lines){
        istringstream iss(line);
        string date, s, t;
        iss >> date >> s >> t;
        t.pop_back();
        
        logs.push_back(time_difference(s, stof(t)*1000));
    }
    
    int answer = 0;
    for(int i=0; i<logs.size(); i++){
        long start = logs[i].first;
        long end = start + 999;
        
        int cnt = compute(start, end);
        if(answer < cnt) answer = cnt;
        
        start = logs[i].second;
        end = start + 999;
        
        cnt = compute(start, end);
        if(answer < cnt) answer = cnt;
    } 
    
    return answer;
}

문제

https://programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr

728x90

[접근1]

lines 안의 문자열을 쪼개고 요청 시각을 구한다.

시각을 정수로 표현하기 위해, hour엔 3600*1000을 곱해서 더하고, minute엔 60*1000을 곱해서 더하고 second엔 1000을 곱해서 더한다(소수점 포함).

이것을 logs라는 벡터에 넣어준다.

for(string line : lines){
    istringstream iss(line);
    string date, s, t;
    iss >> date >> s >> t;
    t.pop_back();

    logs.push_back(time_difference(s, stof(t)*1000));
}

 

pair<long, long> time_difference(string s, int t){
    long t_sec = 0;
    
    istringstream iss(s);
    string buff;
    int i = 2;
    while(getline(iss, buff, ':')){
        buff.erase(remove(buff.begin(), buff.end(), '.'), buff.end());
        t_sec += pow(60, i)*stoi(buff);
        if(i==1) t_sec *= 1000;
        i--;
    }
    
    return {t_sec - t + 1, t_sec};
}

[접근2]

logs 벡터를 돌면서 요청 시작 시각, 완료 시각에 각각 999를 더하여 그 사이에 들어오는 log를 확인한다.

answer보다 cnt 값이 더 크면 answer의 값을 바꿔준다.

int answer = 0;
for(int i=0; i<logs.size(); i++){
    long start = logs[i].first;
    long end = start + 999;

    int cnt = compute(start, end);
    if(answer < cnt) answer = cnt;

    start = logs[i].second;
    end = start + 999;

    cnt = compute(start, end);
    if(answer < cnt) answer = cnt;
}

 

int compute(long start, long end){
    int cnt = 0, idx = 0;
    while(true){
        long log_start = logs[idx].first;
        long log_end = logs[idx].second;
        if(end >= log_start && start <= log_end) {
            cnt++;
        }

        idx++;
        if(idx == logs.size()) break;
    }
    
    return cnt;
}

이렇게 복잡하게 했으나, 다른 사람의 풀이를 봤더니, sscanf를 사용하여 시각을 쪼개서 계산하였고, 큰 배열에 각 로그가 결쳐지는(?) 곳에 1씩 더하여 표시했더라.

다음번엔 이 방법으로 다시 풀어보고싶다.

728x90

댓글