[プログラマー]中秋節の流量


回答日:2021-07-17

質問する


質問リンク:https://programmers.co.kr/learn/courses/30/lessons/17676

アクセスと解析


これは文字列処理と数値計算が必要な問題です.
难しくはないですが、理解力が足りないので、时间をかけて问题を理解しました.
タイミングを容易にするために,入力ログ文字列を適切に処理し,時間をmsに変換した.
ログデータを遍歴しながら,各プロセスの終了後1秒以内に同時に処理されるプロセスの最大数を求めた.

コード#コード#

#include <string>
#include <vector>
#include <sstream>

using namespace std;

vector<string> split(string input, char delimiter) {
    vector<string> answer;
    stringstream ss(input);
    string temp;
 
    while (getline(ss, temp, delimiter)) {
        answer.push_back(temp);
    }
    return answer;
}

int solution(vector<string> lines) {
    int answer = 0;
    vector<int> EndTime, ProcessTime;
    
    for (auto a : lines) {
        stringstream ss(a);
        string date, time, task;
        ss >> date >> time >> task;
        
        vector<string> tmp = split(time, ':');
        string HH = tmp[0];
        string MM = tmp[1];
        string SS = tmp[2];
        SS.erase(SS.begin() + 2, SS.begin() + 3); // 소수점 제거
        task.erase(task.end() - 1, task.end()); // 's' 제거
        
        int t = stod(task) * 1000;
        int msecs = stoi(HH) * 60 * 60 * 1000 + stoi(MM) * 60 * 1000 + stoi(SS);
        EndTime.push_back(msecs);
        ProcessTime.push_back(t);
    }
    
    for (int i = 0; i < lines.size(); i++) {
        int cnt = 1; // 1개는 무조건 처리중
        int scope = EndTime[i] + 1000; // 임의의 프로세스가 끝나는 시간 + 1초까지 범위
        for (int j = i + 1; j < lines.size(); j++) { // 다음 프로세스부터 확인
            int nextStart = EndTime[j] - ProcessTime[j] + 1; // 처리시간은 시작시간과 끝시간을 포함하므로
            
            if (nextStart < scope) { // 다음 프로세스 시작시간이 범위 내에 존재하면
                cnt++;
            }
        }
        answer = max(answer, cnt);
    }
    return answer;
}

結果



フィードバック


なぜ文字列を扱うのにどんなに問題を解いても慣れないのか...
Pythonで文字列を処理するのが便利だと聞いて、Pythonを勉強するようになりました.