아무코딩

[2018 KAKAO BLIND RECRUITMENT 1차] 추석트래픽 본문

알고리즘/프로그래머스

[2018 KAKAO BLIND RECRUITMENT 1차] 추석트래픽

동 코 2020. 5. 7. 22:29

문제풀이

 

핵심이되는 부분은

각 타임별 스타트 지점 끝지점을 기준으로 겹치는 부분을 확인하는 것이다.

 

중간에 포함이 될수도있고, 넘칠수도있고, 뒤만 걸칠수도있고, 앞만 들어갈수도있다. 모든 경우를 다 따져가는 코딩방식이다. 

 

시작지점후 1초, 끝지점후 1초를 모두 비교한다. 

 

매우 복잡하다. 시간을 변경하는 건 무난 했으나 나머지 구현이 좀 복잡한 문제였던 것 같다. 

 

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
 
typedef struct Time{
    int start;
    int end;
    Time(){}
    Time(string hour, string min, string sec, string m_sec, string p_time){
        int hh = stoi(hour) * 60 * 60 * 1000;
        int mm = stoi(min) * 60 * 1000;
        int ss = stoi(sec) * 1000;
        int ms = stoi(m_sec);
        int pt = (int)(stod(p_time)*1000);
        end = hh + mm + ss + ms;
        start = end - pt +1;
    }
}Time;
 
vector<Time> time_datas;
 
bool cmp(Time t1, Time t2) {
    return t1.start < t2.start;
}
 
int solution(vector<string> lines) {
    
    int cnt=0,max_cnt=0;
    
    string hour, min, sec, m_sec, p_time;
    
    for(int i=0;i<lines.size();i++){
        hour = lines[i].substr(11,2);
        min = lines[i].substr(14,2);
        sec = lines[i].substr(17,2);
        m_sec = lines[i].substr(20,3);
        p_time = lines[i].substr(24);
        
        p_time.pop_back();
        time_datas.push_back(Time(hour,min,sec,m_sec,p_time));
    }
    
    sort(time_datas.begin(),time_datas.end(),cmp);
    
    for(int i=0; i<time_datas.size();i++){
        cnt=0;
        for(int j=0;j<time_datas.size();j++){
            if(time_datas[i].start <= time_datas[j].start &&time_datas[i].start+999>=time_datas[j].start)
                cnt++;
            else if(time_datas[i].start>=time_datas[j].start && time_datas[i].start<=time_datas[j].end)
                cnt++;
            else if(time_datas[i].start + 999 < time_datas[j].start)
                break;
            if(max_cnt < cnt)
                max_cnt = cnt;
        }
        
    }
    
    
    forint i=0;i<time_datas.size();i++){
        cnt=0;
        for(int j=0;j<time_datas.size();j++){
            if(time_datas[i].end<=time_datas[j].start && time_datas[i].end + 999 >= time_datas[j].start)
                cnt++;
            else if(time_datas[i].end>=time_datas[j].start && time_datas[i].end <= time_datas[j].end)
                cnt++;
            else if(time_datas[i].end + 999 < time_datas[j].start)
                break;
            if( max_cnt < cnt)
                max_cnt = cnt;
        }
    }
    
    return max_cnt;
}
 
cs
 
 

문제 링크 : www.programmers.co.kr/learn/courses/30/lessons/17676

 

프로그래머스

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

programmers.co.kr

 

Comments