본문 바로가기

code/programmers

2018 카카오 블라인드 테스트 7번

문제 링크:

 

카카오 신입 공채 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;
}