거의 알고리즘 일기장

추석 트래픽_프로그래머스_2018카카오_lv3 본문

알고리즘 문제풀이

추석 트래픽_프로그래머스_2018카카오_lv3

건우권 2020. 3. 31. 12:06

https://programmers.co.kr/learn/courses/30/lessons/17676

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 풀이 방법

 

이 문제는 고려할게 크게 3가지 였다. 

1) 문자열 처리방법

2) 처리시간은 시작시간과 끝시간을 포함

3) string을 double형으로 바꿀때 정밀도 때문의 약간의 오차 

 

1)같은 경우는 그냥 2016-09-15 hh:mm:ss.sss로 인덱스가 고정적이여서 그냥 처음에는 인덱스로 받아와서 풀었었는데 여러 풀이를 찾다보니 밑의 함수를 만들어서 푸는 편이 깔끔한거 같다.

vector<string>strtok(string str, char del = ' ')
{
    vector<string> ret;
    int prev = 0;
    for (int i = 0; i < (int)str.size(); i++)
    {
        if (str[i] == del)
        {
            ret.push_back(str.substr(prev, i - prev));
            prev = i+1;
        }
   }
    //나머지 부분
    if (prev != str.size())
    {
        ret.push_back(str.substr(prev, str.size() - prev));
    }

    return ret;
}

 

2), 3)은 모든수를 (초*1000)단위의 정수형으로 바꾸면 정밀도도 생각해줄 필요없고, 시작시간과 끝시간을 포함하는것은 

범위를 구해줄때 -1만 해주면 된다.

 

 

2. 코드

 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<string>strtok(string str, char del = ' ')
{
    vector<string> ret;
    int prev = 0;
    for (int i = 0; i < (int)str.size(); i++)
    {
        if (str[i] == del)
        {
            ret.push_back(str.substr(prev, i - prev));
            prev = i+1;
        }
   }
    //나머지 부분
    if (prev != str.size())
    {
        ret.push_back(str.substr(prev, str.size() - prev));
    }

    return ret;
}

int solution(vector<string> lines) {
    int answer = 0;

    vector<pair<long long, long long>>data;
    for (int i = 0; i < (int)lines.size(); i++)
    {
        //문자열 나누기
        vector<string> temp = strtok(lines[i]);
        vector<string >tstr = strtok(temp[1], ':');
        long long endTime = (long long)(((stod(tstr[0]) * 3600) + (stod(tstr[1]) * 60) + stod(tstr[2]))*1000);
        long long worktime = (long long)(stod(strtok(temp[2], 's')[0])*1000);

        data.push_back(make_pair(endTime, worktime));
    }

    for (int i = 0; i < (int)data.size(); i++)
    {
        long long c1e = data[i].first;
        long long c1ep = c1e + 1000 - 1;
        int cnt = 0;

        for (int j = i; j < (int)data.size(); j++)
        {
            long long c2e = data[j].first;
            long long c2s = c2e - data[j].second + 1;

            if (c1e <= c2e && c2e <= c1ep)
                cnt++;
            else if (c1e <= c2s && c2s <= c1ep)
                cnt++;
            else if (c2s < c1e && c1ep < c2e)
                cnt++;
        }

        answer = max(cnt, answer);
    }
    return answer;
}

 

 

3. 후기

 

아직 기초가 부족해서 그런지 문자열 처리에서도 애먹었고 그냥 전체적으로 조금 어려웠다..ㅠ  

반응형
Comments