학습(0)/C++ 문제풀이
오픈채팅방
누가 뭐래도 개발자
2025. 3. 8. 15:04
문제점
1. logs 없이 바로 answer에 받아, uid를 닉네임으로 변경하려 했으나, 복잡해져서 gemini 도움 받음
->logs 생성 후 처리.
2. for문 2회차부터 while문이 처리되지 않음.
ss.str(log)는 메시지를 지우고 다시 채워주지만, 플래그까진 지워주지 않기에 clear해야한다.
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
using namespace std;
//방장에게 보이는 관리자 창: "aaa님이 들어왔습니다.,"aaa님이 나갔습니다."
//닉네임 변경: 재입장 | 닉네임 변경 -> 기존 메시지 닉네임도 변경
//닉네임 중복 가능
//결과: 마지막 닉네임으로 입장, 퇴장 메시지
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<pair<string, string>> logs;
unordered_map<string, string> nameMap;
stringstream ss;
string word = "";
for (const string& log : record)
{
ss.str(log);
string arr[3];
int i = 0;
//1. ss을 arr[3]에 받는다.
while (ss >> word && i < 3)
{
arr[i++] = word;
}
//2. [0]명령어, [1]UID, [2]닉네임 1,2 매핑하고, 0,1 logs 저장.
nameMap[arr[1]] = arr[2];
if ("Enter" == arr[0] || "Leave" == arr[0])
{
logs.push_back({ arr[0], arr[1] });
}
ss.clear();
}
//3. logs의 uid를 닉네임으로 변경한다.
for (const auto& log2 : logs)
{
if ("Enter" == log2.first)
{
answer.push_back(nameMap[log2.second] + "님이 들어왔습니다.");
}
else
{
answer.push_back(nameMap[log2.second] + "님이 나갔습니다.");
}
}
return answer;
}
이유는 모르겠는데, 실패.
1,16만 통과하는 사람 특, 문제 분석 제대로 안함.
아, 질문글 보고 알았다.
leave는 닉네임이 나오지 않는다 제길!
if ("Enter" == arr[0] || "Change" == arr[0])
{
nameMap[arr[1]] = arr[2];
}
- 개선
1. ss를 3단어로 받는다.
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
unordered_map<string, string> nameMap;
vector<pair<string, string>> logs;
for (const string& log : record) {
stringstream ss(log);
string command, uid, nickname;
ss >> command >> uid >> nickname;
if (command == "Enter" || command == "Change") {
nameMap[uid] = nickname;
}
if (command == "Enter" || command == "Leave") {
logs.push_back({command, uid});
}
}
for (const auto& log : logs) {
string message = nameMap[log.second] + "님이 ";
message += (log.first == "Enter") ? "들어왔습니다." : "나갔습니다.";
answer.push_back(message);
}
return answer;
}
아니 오히려 시간이 늘었는데, 자바보다 느림.
-> stringstream 생성에 시간이 걸려서 그럼.
stringstream부를 밖으로 빼내야한다.
그래도 배열을 대체한 부분과 msg 삼항연산자는 가독성에 도움을 주었다.