정말 오래간만에 알고리즘 문제를 풀어봤다.
PS 실력은 옜날과 비교할때는 저점이 되었지만
C++ 언어 자체는 김포프님 언매니지드 강의 듣고 나서 이해는 더 잘된듯.
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
using namespace std;
// hashSet == unorderd_map 사용
// UID 와 string 매핑
// 레퍼런스 변경
void Change(unordered_map<string, string> &ud, const string& uid, const string& repN) {
// TODO user에 있는 string을 찾아서 교체, 레퍼런스 교체
ud[uid] = repN;
}
// UUID & Enter/Leave
// UUID & 01010
// UID와 유저 데이터를 잘 묶는것
void HandleAction(
const vector<pair<string, string>> &uaList,
unordered_map<string, int> &roomState,
const unordered_map<string, string>& ud,
vector<string>& answer
) {
for(const auto& action : uaList) {
string chat;
string ua = action.first;
string uuid = action.second;
// cout << ua << " " << uuid << '\n';
if(roomState[uuid] == 0 && ua == "Enter") { // 유저가 없고 Enter가 들어오면 값++
roomState[uuid] = 1;
// 나중에 ud 랑 엮어서 스트링 표시하자
// cout << ud.at(uuid) << "님이 들어왔습니다." << endl;
chat = ud.at(uuid) + "님이 들어왔습니다.";
}
else if(roomState[uuid] == 1 && ua == "Leave") { // 유저가 있고 유저 나가면 리브
roomState[uuid] = 0;
// 나중에 ud 랑 엮어서 스트링 표시하자
// cout << ud.at(uuid) << "님이 나갔습니다." << endl;
chat = ud.at(uuid) + "님이 나갔습니다.";
}
//cout << chat << '\n';
answer.push_back(chat);
}
}
vector<string> solution(vector<string> record) {
vector<string> answer;
// UID와 유저 데이터를 잘 묶는것
unordered_map<string, string> ud;
// 들어온 Instruction과 UID를 저장하는 데이터
vector<pair<string, string>> uaList;
// 채팅방의 상황
unordered_map<string, int> roomState;
/** int index = 0; // 인덱스 확인용 **/
for(const auto& r : record) {
/** cout << index++ << '\n'; // 인덱스 확인용 **/
istringstream iss(r);
string action, UID, userName;
iss >> action >> UID >> userName;
// action UID userName 잘 받아와 진다
// cout << action << " " << UID << " " << userName << '\n';
if(action == "Change") {
// TODO ChangeAction
Change(ud, UID, userName);
}
else {
uaList.push_back(make_pair(action, UID));
}
if(userName != "") {
ud[UID] = userName;
// cout << ud[UID] << " " << UID << " " << userName << '\n';
}
}
// for(auto it = ud.begin(); it != ud.end(); ++it) {
// cout << it->first << " " << it->second << '\n';
// }
// for(auto it = uaList.begin(); it != uaList.end(); ++it) {
// cout << it->first << " " << it->second << '\n';
// }
HandleAction(uaList, roomState, ud, answer);
return answer;
}
아무래도 컨테이너 캐퍼시티를 조절하지는 않아서
스택 메모리가 아슬아슬 할것 같다.
'PS > 알고리즘' 카테고리의 다른 글
[프로그래머스 2019 KAKAO BLIND RECRUITMENT] (level2) 후보키 (0) | 2024.12.26 |
---|---|
[프로그래머스 2019 KAKAO BLIND RECRUITMENT] (level1) 실패율 (0) | 2024.12.21 |
| 알고리즘 | 3 | 그래프-1 | Stack : DFS | 미로찾기 | (0) | 2022.03.13 |
[백준 2992] 크면서 작은 수 (다음 순열 찾기 & next_permutation사용법) (0) | 2021.07.09 |
[프로그래머스 그래프 탐색 DFS/BFS] (level 3) 3번 단어 변환 (0) | 2021.07.08 |