[프로그래머스] - 오픈채팅방

gcoco·2023년 4월 21일
0

다짐을 한 첫날부터 지각~!

안녕하세요 주인장 gcoco입니다!

매일 하나의 문제는 풀어서 올리기로 다짐한게 벌써 2일전이지만(??)
4월 21일이 지난지 아직 1시간 23분밖에 되지 않았으니 아무튼 봐주십시오!

코드부터보시죠! 가아니라...

문제부터 보시죠!

문제링크:

이 문제는 기억에 남는것이, 작년 제가 사제동행세미나라고 교수님께서 추천해주시는 코딩문제를 풀어오는 교과목이 있었습니다. 물론 작년의 저는 안일! 안배! 아이몰라귀찮아!의 자세로 풀지않고 눈으로만 슥 훑고갔던 기억이 있습니다...만!(그 당시의 전 CPP의 C자만 아는 상태였습니다.)

사람은 성장한다고 했던가요.....
CPP의 수련을 통해! 오늘 이 문제를 풀었습니다요!

대단하다 GCOCO!

정말로, 코드를 보시죠!

#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <iostream>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;//답을 저장할 곳
    unordered_map<string,string> um;//uid의 변화 확인을 위한 map
    //record 정보를 분석해보자!
    for(auto i:record){
    	//ss로 정보를 나눠받자!
        stringstream ss;
        ss.str(i);
        string order,id,name;
        ss>>order>>id>>name;
        if(order=="Enter"){
            um[id]=name;
            answer.emplace_back("님이 들어왔습니다.");
        }
        else if(order=="Leave"){
            answer.emplace_back("님이 나갔습니다.");
        }
        else{
            um[id]=name;
        }
    }
    
    int j=0;
    
    for(int i=0;i<record.size();i++){
        stringstream ss;
        ss.str(record[i]);
        string order,id,name;
        ss>>order>>id>>name;
        if(order=="Change"){
            continue;
        }
        else{
            answer[j++].insert(0,um[id]);
        }
    }
    return answer;
}

음. 조금 길고 비효율적으로 보이는거 같기도 합니다!
제 실력이 아직은 딱 요정도인 것이겠죠...
아무튼~ 코드 분석을 하면 다음의 순서와 같습니다.

  1. record를 순회하며 stringstream을 이용해 order,uid,name을 나눠받는다.
  2. order가 "Enter" 또는 "Leave"일 경우 answer의 '한글부분'만 구축한다.
  3. order가 "Enter" 또는 "Change"일 경우 um에 저장, 갱신 작업을 한다.
  4. 두번째 포문에서 record를 접근하며 order가 "Change"일 경우 continue
  5. 그 외의 경우는 answer의 앞부분에 닉네임을 달아주기

이 정도가 되겠군요!
다시금 요약해보자면, record를 달며 answer을 대충 만들어주고 uid에 따른 닉네임을 확인 갱신작업을 해줍니다. 그리고나면 answer엔 닉네임이 빈 상태로 "님이 들어왔습니다."또는 "님이 나갔습니다." 부분만 남아있겠죠? 이 부분을 두번째 포문에서 채워주는겁니다!


참고로 이 문제에서 재밌었던 점이 있습니다.

um[id]=name;

이 부분을 주의해야 한다는 점입니다!

for(auto i:record){
    	//ss로 정보를 나눠받자!
        stringstream ss;
        ss.str(i);
        string order,id,name;
        ss>>order>>id>>name;
        um[id]=name;
        if(order=="Enter"){
            answer.emplace_back("님이 들어왔습니다.");
        }
        else if(order=="Leave"){
            answer.emplace_back("님이 나갔습니다.");
        }
    
    }

이런식으로 작성해선 안된다는 것이죠. 왜일까요?
사실 간단한 문제입니다.
record에서 "Leave"일 경우는 name없이 uid만 제공한다는 사실입니다!!!!!저만 재밌었나요?

즉 위와 같은 코드로 작성하게 된다면 uid에 존재하지 않는 name이 들어간다는 사실이지요.
유령회원인가요? ㅋㅋ~

설명은 이정도로 마무리 하겠습니다.

다음 문제에서 뵙겠습니다!

profile
그코코 입니다.

0개의 댓글