https://www.acmicpc.net/problem/7785
1. 문제
상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.
각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.
상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
2. 입력
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 10^6) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다. 사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
3. 출력
현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.
4. C++ 코드
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
string name ,state;
map <string, string, greater<string>> log;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> name >> state;
log[name] = state;
}
map<string, string>::iterator it;
for (it = log.begin(); it != log.end(); ++it) {
if (it->second == "enter") {
cout << it->first << "\n";
}
}
return 0;
}
5. 문제 풀이
본 문제는 회사원의 데이터의 정보에 대해 이름과 출입 상태를 입력으로 받는다. 하나의 데이터에 이름과 값으로 구분되는 것을 확인할 수 있다. Python의 key와 value를 담는 dictionary 자료형이 있듯이 C++에도 key와 value 담을 수 있는 map 자료형이 있다. dictionary는 해시 테이블로 구성되는 반면, map은 트리(레드 블랙 트리)로 구성된다는 차이점이 있다. #include <map>와 같이 map 헤더파일을 불러오면 map 자료형을 사용할 수 있다.
map 자료형은 다음과 같이 map <key, value, (compare)> var;로 선언한다. map은 기본적으로 key를 기준으로 오름차순으로 정렬하므로 변수를 선언 시, greater<type>을 compare에 추가해주면 내림차순으로 정렬할 수 있다. 반복문을 통하여 var[key] = value;로 log에 저장한 후, iterator를 통하여 value(it->second)의 값이 "enter"인 경우 출력하도록 하였다.
cplusplus.com의 Reference에는 C++의 STL에 관한 정보들이 있으니 이를 참조하면 도움이 된다.
https://cplusplus.com/reference/
'Koala - 8기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/python] 23972 악마의 제안 (0) | 2022.09.25 |
---|---|
[백준/Python]3181번 줄임말 만들기 (0) | 2022.09.25 |
[백준/python] 14724번 관리자는 누구? (2) | 2022.09.25 |
[백준/python] 5704번 팬그램 (0) | 2022.09.25 |
[백준/Python] 1620 나는야 포켓몬 마스터 이다솜 (1) | 2022.09.23 |