https://www.acmicpc.net/problem/19583
[필자 사고]
필자는 조건에 맞는 이름들을 myMap에다 넣어놓고
ㄷㅏ음 조건에 맞는 이름들을 myMap2 에 넣었다.
그 다음 서로의 교집합을 검사하여 문제를 해결했다.
insert하는데 log n
찾는데 log n 이기 때문에 시간복잡도에서 문제 없이 해결할 수 있다.
[코드 해설]
이 프로그램은 특정 시간대에 채팅한 사용자들을 추적해서,
- 입장 시간 전에 채팅한 사용자(myMap) 와
- 퇴장 시간 전에 다시 채팅한 사용자(myMap2)
이 두 조건을 모두 만족하는 사람 수를 계산한다.
2. myMap의 역할
myMap은 스트리밍 입장 전(즉, 스트리밍 시작 시간보다 이른 시각)에 채팅한 사용자들을 기록한다.
- 각 줄의 채팅 기록에서 시간과 사용자명을 분리한다.
- 시간 비교를 통해 사용자가 스트리밍 시작 전인지 확인한다.
- 해당 사용자의 이름을 myMap에 저장한다.
- 자료형은 map<string, int>로 구성되어 있어, 사용자명을 키로 하고 값은 단순히 1로 저장된다.
- 이때 insert 함수나 대입 연산을 통해 사용자 중복 없이 저장된다.
3. myMap2의 역할
myMap2는 스트리밍 중간 기준 시간 이후부터 종료 시간까지의 사이에 채팅한 사용자들을 기록한다.
- myMap과 마찬가지로, 각 줄의 채팅 시각을 확인하여 해당 구간에 속하는지 판단한다.
- 조건을 만족하는 사용자는 myMap2에 저장된다.
- 이 역시 사용자명을 키로 하며, 중복 없이 한 번만 저장된다.
4. 사용자 조건 만족 여부 판별
결과 계산은 Game_Start() 함수에서 이루어진다.
- myMap에 저장된 모든 사용자명을 하나씩 확인한다.
- 그 사용자명이 myMap2에도 존재하는지를 검사한다.
- 양쪽 모두에 존재하는 경우, 해당 사용자는 입장 전에도, 퇴장 전에도 채팅한 것이므로 조건을 만족한 것으로 간주하고 카운트를 증가시킨다.
5. 정리
- myMap: 처음 참여 여부를 기록
- myMap2: 마무리 참여 여부를 기록
- 두 맵 모두에 이름이 있는 사람만 최종적으로 스트리밍에 처음부터 끝까지 참여한 사용자로 인정되어 카운트된다.
[소스 코드]
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
#include <string>
using namespace std;
string startTime, endTime, streamEndTime;
map<string, int> myMap;
map<string, int> myMap2;
void Input() {
cin >> startTime >> endTime >> streamEndTime;
cin.ignore();
string line;
while (getline(cin, line)) {
if (line[0] == '\0')break;
string time = line.substr(0, 5);
string name = line.substr(6, line.size());
if (time <= startTime) {
myMap.insert({ name,1 });
}
else if (time >= endTime && time <= streamEndTime) {
myMap2.insert({ name,1 });
}
}
}
void Game_Start() {
int resultCount = 0;
for (auto node : myMap) {
string name = node.first;
if (myMap2[name] == 1) {
resultCount++;
}
}
cout << resultCount;
}
int main(void) {
Input();
Game_Start();
}
'백준 > 문자열' 카테고리의 다른 글
백준 4889 c++ "안정적인 문자열" -PlusUltraCode- (0) | 2025.04.01 |
---|---|
백준 2002 c++ "추월" -PlusUltraCode- (0) | 2025.03.31 |
백준 1254 c++ "팰린드롬 만들기" -PlusUltraCode- (0) | 2025.03.28 |
백준 1431 c++ "시리얼 번호" -PlusUltraCode- (0) | 2025.03.28 |
백준 20920 c++ "영단어 암기는 괴로워" -PlusUltraCode- (0) | 2025.03.28 |