[프로그래머스] 추석 트래픽

김개발·2021년 7월 18일
0

프로그래머스

목록 보기
27/42

문제 푼 날짜 : 2021-07-17

문제

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17676

접근 및 풀이

문자열 처리와 숫자 계산을 잘해야하는 문제였다.
엄청 어렵진 않았는데 이해력이 부족해서 문제를 이해하는데 시간이 좀 걸렸다...

시간 계산의 편의를 위해 입력로그 string을 적절히 처리하여 시간을 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;
}

결과

피드백

왜 문자열 처리하는 건 아무리 문제를 풀어도 익숙해지지가 않는 것일까..
파이썬을 이용하면 문자열 처리가 더 편해진다는데, 파이썬을 공부해야할 것 같다.

profile
개발을 잘하고 싶은 사람

0개의 댓글