학습(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 삼항연산자는 가독성에 도움을 주었다.