코딩테스트 연습/programmers

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

수기 2022. 2. 7. 21:55

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

  1. 코딩테스트 연습
  2. 2018 KAKAO BLIND RECRUITMENT
  3. [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
이분의 블로그를 참고하였습니다. 감사합니다!