C++/Baekjoon
< 백준 BaekJoon : 7785번 회사에 있는사람> C++
J2on
2023. 8. 4. 22:47
문제
https://www.acmicpc.net/problem/7785
7785번: 회사에 있는 사람
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는
www.acmicpc.net
풀이
문제 자체는 그렇게 어려운 문제가 아니죠. 저는 STL 사용에 익숙해져 보려고 map을 이용해서 풀어봤습니다.
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
map<string, bool, greater<string>> employeeMap;
string name, status;
bool isAttendence;
int num;
cin >> num;
for(int i=0; i<num; i++){
cin >> name >> status;
if(status == "enter"){
isAttendence = true;
}
else{
isAttendence = false;
}
if(employeeMap.find(name) == employeeMap.end()){
employeeMap.insert({name, isAttendence});
}
else{
employeeMap.find(name)->second = isAttendence;
}
}
for(auto m : employeeMap){
if(m.second){
cout << m.first << '\n';
}
}
}
map을 이용해 <string, bool> 형태로 작성해 보았는데, 확실히 이런 문제에서는 과한 감이 있네요.
vector를 활용하면 다음과 같이 풀 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
string name, status;
int num;
cin >> num;
vector<string> employees;
for(int i=0; i<num; i++){
cin >> name >> status;
employees.push_back(name);
}
sort(employees.rbegin(), employees.rend());
for(int i=0; i<employees.size(); i++){
if(employees[i] == employees[i+1]){
i++;
}
else{
cout << employees[i] << '\n';
}
}
}
이름만 vector에 넣고 역순정렬한 후에
대충 옆에 있는 애랑 같으면 이름이 두번 나왔다는 거니 퇴근했다는거겠죠.
이 문제에서 전날 출근해서 지금 퇴근하는 사람은 없을테니까.
그런식으로 해결할 수 있습니다.
+ 그리고 오랜만에 백준 푸느라 까먹었던건데,,, endl 보다 \n을 쓰는게 시간 단축에 큰 힘이 됩니다.
이거 까먹고 있다가 괜히 문제 한 번 더 풀었음..