본문 바로가기
나도 공부한다/알고리즘

[백준] 싸이버개강총회 (C++)

by 꾸빵이 2024. 6. 13.

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처럼 쓰면 되는데 생각 못했다.

시간을 비교할 때 파싱하지 않아도 되는데 파싱하려고 했다.