본문 바로가기
백준/문자열

백준 19583 c++ "싸이버개강총회" -PlusUltraCode-

by PlusUltraCode 2025. 3. 28.

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();
}