[Programmers] 프로그래머스 추석 트래픽
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
- 코딩테스트 연습
- 2018 KAKAO BLIND RECRUITMENT
- [1차] 추석 트래픽
1. lines로 입력받은 값을 공백기준으로 나누어 time[][0]에는 응답완료시간, time[][1]에는 처리시간을 저장한다
2. time[][0]에서 필요없는 첫부분 "2016-09-15"를 지운다
3. 응답완료시간 기준으로 time벡터를 오름차순 정렬한다
4. time[][1] (=처리시간)의 필요없는 마지막 문자's'를 제거한다
5. hms에 문자 ':'를 기준으로시간/분/초로 각각 나누어 저장한다.
6. response에 응답완료시간을 초 단위로 변경하여 연산한다. hms는 문자이므로 stod로 double형으로 바꿔준다.
double responseCompleteTime = (stod(hms[i][0]) * 3600) + (stod(hms[i][1]) * 60) + stod(hms[i][2]);
7. 처리시간은 time[i][1]에 저장되어있는 시간을 stod로 double형으로 변환만 해준다.
8. response[][0]에는 응답처리시작시간, response[][1]에는 응답완료시간을 각각 저장한다.
9. 앞으로 들어오는 시간 중에서 end+1보다 작거나 start+1보다 작거나 같은 시작시간이 있다면 Max++
time을 시작시간 기준으로 오름차순 정렬해두었으므로, 현재 start와 end 기준으로부터 항상 현재 기준점start보다는 큰 값만 들어오게 된다. 그러므로 봐야할 것은 start+1보다 작거나 같은 경우, 또는 end+1보다 시작시간이 작은 경우에 Max++를 해준다.
10. 최댓값을 계속 answer에 업데이트 한다.
main포함 코드(c++)
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
bool cmp(vector<string> a, vector<string> b){
return a[0] < b[0];
}
int solution(vector<string> lines) {
int answer = 0;
vector<vector<string>> time(lines.size());
for(int i=0;i<lines.size();i++){
istringstream ss(lines[i]);
string word;
while (getline(ss, word, ' ')) {
time[i].push_back(word);
}
}
for(int i=0;i<lines.size();i++) time[i].erase(time[i].begin());
//시작시간 기준 정렬
for(int i=0;i<lines.size();i++)sort(time.begin(), time.end(), cmp);
vector<vector<string>> hms(lines.size());
for(int i=0;i<lines.size();i++){
time[i][1].erase(time[i][1].end()-1); //s 제거
istringstream ss(time[i][0]);
string word;
while (getline(ss, word, ':')) {
hms[i].push_back(word);
}
}
vector<vector<double>> response(lines.size()); // 응답시작시간, 응답완료시간
for(int i=0;i<lines.size();i++) {
string ss = time[i][0];
double responseCompleteTime = (stod(hms[i][0]) * 3600) + (stod(hms[i][1]) * 60) + stod(hms[i][2]); // 응답완료시간 -> 초 단위로 변경
double throughTime = stod(time[i][1]); // 처리시간
double responseStartTime = responseCompleteTime - throughTime + 0.001;
response[i].push_back(responseStartTime);
response[i].push_back(responseCompleteTime);
}
for(int j=0;j<lines.size();j++){
double start = response[j][0];
double end = response[j][1];
int Max = 1;
for(int i=j+1;i<lines.size();i++){
if( end+1 > response[i][0] || start+1 >= response[i][0] ) Max++;
}
answer = max(answer, Max);
}
return answer;
}
int main()
{
// vector<string> lines = {
// "2016-09-15 01:00:04.001 2.0s",
// "2016-09-15 01:00:07.000 2s" };
// vector<string> lines = {
// "2016-09-15 01:00:04.002 2.0s",
// "2016-09-15 01:00:07.000 2s" };
vector<string> lines = {
"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-15 21:00:00.748 2.31s",
"2016-09-15 21:00:00.966 0.381s",
"2016-09-15 21:00:02.066 2.62s" };
solution(lines);
return 0;
}
https://hochoon-dev.tistory.com/84
이분의 블로그를 참고하였습니다. 감사합니다!