문제 푼 날짜 : 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;
}
왜 문자열 처리하는 건 아무리 문제를 풀어도 익숙해지지가 않는 것일까..
파이썬을 이용하면 문자열 처리가 더 편해진다는데, 파이썬을 공부해야할 것 같다.