본문 바로가기

problem solving

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

#include <string>
#include <vector>
 
using namespace std;
 
int solution(vector<string> lines) {
    int answer = 0;
 
    vector<pair<intint>> val;
    int count, hms, sum, num, dif;
    string str;
    for (int i = 0; i < lines.size(); i++) {
        count = -1;
        hms = 0, sum = 0, num = 0, dif = 0;
        str = "";
        //년,월,일 패스
        while (lines[i][++count] != ' ') {
        }
        //시간을 초단위로 전환
        while (lines[i][++count] != ' ') {
            if (lines[i][count] == ':' || lines[i][count] == '.') {
                if (hms == 0) {
                    sum += stoi(str) * 3600;
                }
                else if (hms == 1) {
                    sum += stoi(str) * 60;
                }
                else if (hms == 2) {
                    sum += stoi(str);
                }
                str = "";
                hms++;
            }
            else {
                str += lines[i][count];
            }
        }
        //소수점 더하기 까다로우니 자리수 3자리 업
        num = stoi(str);
        for (int j = 0; j < 3; j++) {
            sum = sum * 10;
        }
        sum += num;
        //응답완료시간을 3자리 업했기 때문에, 처리시간도 3자리 업해주기 위해서 앞에 0의 개수를 구한다
        str = "";
        num = 0;
        count++;
        while (lines[i][count] == '0' || lines[i][count] == '.') {
            if (lines[i][count] != '.') {
                num++;
            }
            count++;
        }
        while (count < lines[i].length() - 1) {
            if (lines[i][count] != '.') {
                str += lines[i][count];
            }
            count++;
        }
        //자리수 3자리 업한 처리시간 계산
        dif = stoi(str);
        for (int j = 0; j < 3 - num - str.length() + 1; j++) {
            dif = dif * 10;
        }
        //시작값과 종료값을 벡터에 추가한다
        val.push_back({ sum - dif + 1, sum });
    }
 
    //이중 반복문을 이용해 두번 째 반복문에서의 값이 첫 번째 범위(val[j].first < val[j].second + 1000 && val[j].second > val[j].first)에 속할 때 count를 증가시킨다
    int cur_min, cur_max;
    int max = 0;
    for (int i = 0; i < val.size(); i++) {
        cur_max = val[i].second, cur_min = val[i].first;
        count = 1;
        for (int j = i + 1; j < val.size(); j++) {
            if (val[j].first < cur_max + 1000 && val[j].second > cur_min) {
                count++;
            }
        }
        max = max > count ? max : count;
    }
 
    answer = max;
    return answer;
}
cs

'problem solving' 카테고리의 다른 글

[BOJ]15683번: 감시  (0) 2020.07.18
[프로그래머스]종이접기  (0) 2020.07.17
[프로그래머스]N진수 게임  (0) 2020.07.14
[프로그래머스]파일명 정렬  (0) 2020.07.13
[프로그래머스]압축문자열  (0) 2020.07.12