Key
단순히 주어진 시간과 input 시간을 비교하면 된다. 하지만!! 여기서 포인트는 모든 시간이 00:00 형태로 입력된다는 것이다. 어떻게 해야 더 간단하게 비교할 수 있는지 생각해봐야한다. 나도 처음에 풀 때 파싱을 시도했었고, 다른 분들의 풀이를 봤을 때도 문자열을 자르거나 시간을 분 단위로 바꾸는 풀이가 많았다. 하지만 그대로 비교해도 된다.
Idea
이름이 유니크한 값이므로 이걸 key로 하는 unordered map을 사용했다. 그리고 입력이 들어올 때마다 S,Q,E와 시간을 비교했다. 시간이 11:00AM 이런식으로 들어오지 않고 24시간 체계로 있는 그대로 들어오므로 변형을 할 필요가 없다. 처음에는 erase함수로 가운데 있는 : 를 제외하고 비교하는 방법을 생각했었다. 그런데 이건 string이고, 따라서 형태를 변형하지 않아도 문제가 없다.
그리고 채팅을 여러번 보낼 수 있으므로 중복 처리도 해줬다. 이미 출석 기준에 부합하는 경우엔 퇴장 조건을 검사하지 않는 것이다.
Code
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
string S, E, Q, inputTime, name;
int main() {
int cnt = 0;
unordered_map<string, int>user;
cin >> S >> E >> Q;
while (1) {
if (cin.eof()) break;
cin >> inputTime >> name;
// 입장 먼저 체크
if (inputTime <= S) {
user[name] = 1;
}
// 퇴장 체크
else if (E <= inputTime && Q>=inputTime) {
// 입장했을 경우에만 카운트.
if (user[name] == 1) {
cnt++;
// 여러번 채팅을 할 수 있으니 중복제거
user[name] = 2;
}
}
}
cout << cnt << "\n";
return 0;
}
더보기
회고
아쉬웠던 부분
unordered_map을 사용하면 되는데 이걸 생각하지 못해서 vector로 어렵게 풀려고 했다. 입장 퇴장 여부를 비교할 때도 unordered_map으로 flag처럼 쓰면 되는데 생각 못했다.
시간을 비교할 때 파싱하지 않아도 되는데 파싱하려고 했다.
'나도 공부한다 > 알고리즘' 카테고리의 다른 글
[백준] 14940. 쉬운 최단거리 (C++) (1) | 2024.06.16 |
---|---|
[백준] 16113. 시그널 (C++) (0) | 2024.06.15 |
[백준] 5212. 지구 온난화 (C++) (0) | 2024.06.12 |
[백준] 1238. 단축키 지정 (C++) (0) | 2024.03.10 |
[백준] 2477. 참외밭 (C++) (0) | 2024.02.25 |