https://www.acmicpc.net/problem/7785
문제 자체는 그렇게 어려운 문제가 아니죠. 저는 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을 쓰는게 시간 단축에 큰 힘이 됩니다.
이거 까먹고 있다가 괜히 문제 한 번 더 풀었음..
< 백준 BaekJoon : 1934번 최소공배수 > C++ (0) | 2023.10.16 |
---|---|
< 백준 BaekJoon : 11478번 서로 다른 문자얼의 개수> C++ (0) | 2023.08.04 |
< 백준 BaekJoon : 19532번 수학은 비대면강의입니다.> C++ (0) | 2023.08.04 |
< 백준 BaekJoon : 9506번 약수들의 합> C++ (0) | 2023.08.03 |
< 백준 BaekJoon : 2903번 중앙 이동 알고리즘> C++ (0) | 2023.08.02 |
댓글 영역