문제 링크:
카카오 신입 공채 1차 코딩 테스트 문제 해설
‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인으로 치러졌습니다. 지원자들의 개발 능력을 잘 검증하기 위해 출제 위원들이 한 땀 한 땀 독창적이고 다양한 문제들을 만들어 냈고 문제에 이상은 없는지, 테스트케이스는 정확한지 풀어보고 또 풀어보며 […]
tech.kakao.com
입출력:
TC# | 입력 | 출력 |
2016-09-15 01:00:04.001 2.0s 2016-09-15 01:00:07.000 2s |
1 | |
2016-09-15 01:00:04.002 2.0s 2016-09-15 01:00:07.000 2s |
2 | |
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 |
7 |
코드:
// 소요시간 2시간 28분
/* 1. 시간 단위 별 받아올림 받아내림 연산하지 말고 가작 작은 단위인 msec으로 통일 */
/* 2. cin 으로 string 받으면 한 줄 전체가 들어오는 게 아니라 한 줄에서 whitespace로 구분된 token들이 들어옴 */
/* 3. 이벤트 직전의 시점은 t - 1 */
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct lg {
int t; // time
bool be; // begin/end 0이면 시작 1이면 종료
int ln;
};
vector<lg> logs;
int ans;
int ln;
bool cmp(lg a, lg b) {
return a.t < b.t;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
while (!cin.eof()) {
/* 1 */
string date, time, sec;
cin >> date >> time >> sec;
int S = (time[0] - '0') * 10 + time[1] - '0'; // hr
S = 60 * S + (time[3] - '0') * 10 + time[4] - '0'; // min
S = 60 * S + (time[6] - '0') * 10 + time[7] - '0'; // sec
S = 1000 * S + (time[9] - '0') * 100 + (time[10] - '0') * 10 + time[11] - '0'; // msec
int T = (sec[0] - '0') * 1000;
int i;
for (i = 1; sec[i] != 's'; ++i);
switch (i) {
case 5: T += sec[4] - '0';
case 4: T += (sec[3] - '0') * 10;
case 3: T += (sec[2] - '0') * 100;
}
logs.push_back({S - T + 1, 0, ln});
logs.push_back({S + 1, 1, ln});
++ln;
}
sort(logs.begin(), logs.end(), cmp);
int job_ctr = 0;
for (int i = 0; i < logs.size(); ++i) {
// 이벤트 직전 : logs[i].t - 1
int tmp_job_ctr = job_ctr;
/* 3 */
for (int j = i + 1; j < logs.size() && logs[i].t - 1 + 999 >= logs[j].t; ++j) {
if (logs[j].be == 0)
++tmp_job_ctr;
}
if (tmp_job_ctr > ans)
ans = tmp_job_ctr;
// 이벤트 당시 : logs[i].t
if (logs[i].be == 0)
++job_ctr;
else
--job_ctr;
tmp_job_ctr = job_ctr;
for (int j = i + 1; j < logs.size() && logs[i].t + 999 >= logs[j].t; ++j) {
if (logs[j].be == 0)
++tmp_job_ctr;
}
if (tmp_job_ctr > ans)
ans = tmp_job_ctr;
}
cout << ans;
return 0;
}