728x90
다시 한번 풀기
더보기
#include <bits/stdc++.h>
using namespace std;
pair<long, long> time_difference(string s, int t){
long t_sec = 0;
istringstream iss(s);
string buff;
int i = 2;
while(getline(iss, buff, ':')){
buff.erase(remove(buff.begin(), buff.end(), '.'), buff.end());
t_sec += pow(60, i)*stoi(buff);
if(i==1) t_sec *= 1000;
i--;
}
return {t_sec - t + 1, t_sec};
}
vector<pair<long, long>> logs;
int compute(long start, long end){
int cnt = 0, idx = 0;
while(true){
long log_start = logs[idx].first;
long log_end = logs[idx].second;
if(end >= log_start && start <= log_end) {
cnt++;
}
idx++;
if(idx == logs.size()) break;
}
return cnt;
}
int solution(vector<string> lines) {
for(string line : lines){
istringstream iss(line);
string date, s, t;
iss >> date >> s >> t;
t.pop_back();
logs.push_back(time_difference(s, stof(t)*1000));
}
int answer = 0;
for(int i=0; i<logs.size(); i++){
long start = logs[i].first;
long end = start + 999;
int cnt = compute(start, end);
if(answer < cnt) answer = cnt;
start = logs[i].second;
end = start + 999;
cnt = compute(start, end);
if(answer < cnt) answer = cnt;
}
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/17676
코딩테스트 연습 - [1차] 추석 트래픽
입력: [ "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-1
programmers.co.kr
728x90
[접근1]
lines 안의 문자열을 쪼개고 요청 시각을 구한다.
시각을 정수로 표현하기 위해, hour엔 3600*1000을 곱해서 더하고, minute엔 60*1000을 곱해서 더하고 second엔 1000을 곱해서 더한다(소수점 포함).
이것을 logs라는 벡터에 넣어준다.
for(string line : lines){
istringstream iss(line);
string date, s, t;
iss >> date >> s >> t;
t.pop_back();
logs.push_back(time_difference(s, stof(t)*1000));
}
pair<long, long> time_difference(string s, int t){
long t_sec = 0;
istringstream iss(s);
string buff;
int i = 2;
while(getline(iss, buff, ':')){
buff.erase(remove(buff.begin(), buff.end(), '.'), buff.end());
t_sec += pow(60, i)*stoi(buff);
if(i==1) t_sec *= 1000;
i--;
}
return {t_sec - t + 1, t_sec};
}
[접근2]
logs 벡터를 돌면서 요청 시작 시각, 완료 시각에 각각 999를 더하여 그 사이에 들어오는 log를 확인한다.
answer보다 cnt 값이 더 크면 answer의 값을 바꿔준다.
int answer = 0;
for(int i=0; i<logs.size(); i++){
long start = logs[i].first;
long end = start + 999;
int cnt = compute(start, end);
if(answer < cnt) answer = cnt;
start = logs[i].second;
end = start + 999;
cnt = compute(start, end);
if(answer < cnt) answer = cnt;
}
int compute(long start, long end){
int cnt = 0, idx = 0;
while(true){
long log_start = logs[idx].first;
long log_end = logs[idx].second;
if(end >= log_start && start <= log_end) {
cnt++;
}
idx++;
if(idx == logs.size()) break;
}
return cnt;
}
이렇게 복잡하게 했으나, 다른 사람의 풀이를 봤더니, sscanf를 사용하여 시각을 쪼개서 계산하였고, 큰 배열에 각 로그가 결쳐지는(?) 곳에 1씩 더하여 표시했더라.
다음번엔 이 방법으로 다시 풀어보고싶다.
728x90
'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 거리두기 확인하기(c++) (0) | 2022.04.28 |
|---|---|
| [programmers] Lv.3 표 편집(c++) (0) | 2022.04.27 |
| [programmers] Lv.2 오픈채팅방(c++) (0) | 2022.04.18 |
| [programmers] Lv.2 문자열 압축(c++) (0) | 2022.04.15 |
| [programmers] Lv.1 숫자 문자열과 영단어(c++) (0) | 2022.03.08 |
댓글