오답노트
프로그래머스 2단계 - 오픈채팅방 본문
https://programmers.co.kr/learn/courses/30/lessons/42888
- 문제 파악
오픈 채팅방은 사용자가 들어오거나 나가면 화면에 메세지를 띄운다. 이 메세지에는 사용자의 닉네임이 출력된다. 오픈채팅방은 사용자들끼리 중복된 닉네임을 사용할 수 있다. 사용자가 닉네임을 바꿀 수 있는 조건은 한번 들어온 뒤 나갔다가 다른 닉네임으로 재접속할때, 또는 채팅방 내에서 닉네임을 바꾸는 경우 밖에 없다. 오픈채팅방에서 일어난 이벤트가 담긴 배열을 입력 받을 때, 오픈채팅방을 생성한 사용자가 보는 메세지를 출력하라.
- 정답
원래는 map으로 풀 생각을 했으나, 일단 vector<pair<string,string>>으로 접근해서 풀었다. 하지만 정답률도 낮고 시간초과도 발생했다. 반복문을 무조건 두번 돌아야 하니 시간복잡도가 자연스럽게 높아진거 같다.
그래서 map으로 풀었더니 됐다...
map 메소드를 따로 외우지 않아서 일부러 vector로 접근했는데, 이번 기회에 map메소드를 익혀보자.
#include "bits/stdc++.h"
using namespace std;
vector<string> seperate(string str)
{
vector<string> vec;
int start_pos = 0;
int space_pos = str.find(" ");
while (space_pos > 0)
{
vec.push_back(str.substr(start_pos, space_pos - start_pos));
start_pos = space_pos + 1;
space_pos = str.find(" ", start_pos);
}
vec.push_back(str.substr(start_pos, str.size() - start_pos));
return vec;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
//vector<pair<string,string>> userid; //아이디, 닉네임
map<string,string> userid; // 아이디 닉네임
for(auto rcd : record)
{
vector<string> vec = seperate(rcd);
if(vec[0] == "Enter")
{
answer.push_back(vec[1] + "님이 들어왔습니다.");
if(userid.find(vec[1]) != userid.end())
{
userid.erase(vec[1]);
userid.insert({vec[1],vec[2]});
}
else
userid.insert({vec[1],vec[2]});
}
else if(vec[0] == "Leave")
{
answer.push_back(vec[1] + "님이 나갔습니다.");
}
else if(vec[0] == "Change")
{
if(userid.find(vec[1]) != userid.end())
{
userid.erase(vec[1]);
userid.insert({vec[1],vec[2]});
}
else
userid.insert({vec[1],vec[2]});
}
}
for(int i = 0 ; i < answer.size() ; i++)
{
int ntmp = answer[i].find("님");
if(ntmp > -1)
{
string str_id = answer[i].substr(0, ntmp);
auto str_name = userid.find(str_id);
answer[i].replace(0, str_id.size(), str_name->second);
}
}
return answer;
}
'C,C++ > 코딩테스트' 카테고리의 다른 글
프로그래머스 2단계 - 조이스틱 - 오답노트 (0) | 2022.06.05 |
---|---|
프로그래머스 2단계 - 카카오프렌즈 컬러링북 (0) | 2022.06.04 |
프로그래머스 2단계 - 문자열 압축 (0) | 2022.06.03 |
프로그래머스 2단계 - 하노이의 탑 - 오답노트 (0) | 2022.06.02 |
프로그래머스 2단계 - N개의 최소공배수 (0) | 2022.06.02 |