본문 바로가기
코딩테스트 준비/백준

[백준 7785번][C++] 회사에 있는 사람

by 스테디코디스트 2023. 7. 20.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{
	int n;
	cin >> n;

	map<string, bool, greater<string>> entry;

	for (int i = 0; i < n; i++)
	{
		string name, record;
		cin >> name >> record;

		if (record == "enter")
		{
			// 들어온 경우
			entry.insert({ name, true });
		}
		else
		{
			// 나간 경우 -> 아예 삭제
			entry.erase(name);
		}
	}

	for (map<string, bool>::iterator iter = entry.begin(); iter != entry.end(); iter++)
	{
		if (iter->second)
		{
			// 아직 나가지 않은 경우
			cout << iter->first << "\n"; // 해당 이름 출력
		}
	}
}

<풀이과정>

1. n을 입력받고, 키로 string형을 값으로 bool형을 가지는 map을 선언한다.

2. 이때 map은 기본적으로 오름차순 정렬이 되는데 이 문제의 경우 내림차순으로 출력해야하므로 선언할 때, greater<string>을 추가해 string을 기준으로 내림차순으로 정렬할 것을 알려준다.

3. 그 다음 n만큼 반복하면서 이름(name)과 기록(record)을 입력받는다.

4. record가 "enter"인 들어온 경우, map에 해당 name과 안에 있음을 알려주는 true값을 넣어준다.

5. 그렇지 않을 경우는 나간 경우이므로 map에 해당 키값을 가진 원소를 삭제시킨다.

6. 모든 입력이 끝난뒤 반복자 iterator를 이용해 map의 원소들을 돌면서 해당 원소의 값(iter->second)이 true인 경우에만 해당 원소의 키값(iter->first)을 출력한다.

7. 출력할때 "\n"을 이용해 출력 버퍼를 비워주는 과정을 생략하면서 진행한다.


<코멘트>

아늬,,, endl으로 했다고 계속 시간초과 나는 줄 모르고 이것저것 다해봤다...

결국 endl을 "\n"으로 바꾸니까 바로 성공했다...😢

근데 왜 그런거지..?

 

알아본결과 endl은 출력 버퍼를 비워주는 과정인 flush가 들어있기 때문에 \n보다 느리다고 한다!

cout << endl,  cout << "\n", printf("\n") 순서로 속도가 빠르다고 한다.


<제출결과>

눈물나는 시간초과의 흔적...