문제 설명 |
본 문제는 프로그래머스의 오픈채팅방 문제이다.
오픈채팅방에 닉네임a와 닉네임b 가 있습니다. 채팅방 안에서는 닉네임을 변경할 수 있으며 입장과 퇴장 시 닉네임과 함께 알림이 발생합니다. 채팅방을 나가고 다시 들어오게 되면 닉네임을 새로 설정할 수 있는데 그렇게 될 시 나가기 전에 올라왔던 알림의 닉네임 또한 바뀐 닉네임으로 변경됩니다.
입장과 퇴장, 닉네임 변경의 기록이 담긴 record라는 string 배열을 통한 올라온 모든 알림을 string 배열로 반환합니다.
record안의 문자열은 명령 ID 닉네임이 공백으로 구분되어있다.
해결 과정 |
파싱을 통해 명령, ID, 닉네임의 세 문자열로 구분합니다.
최종 변경이 완료되기 전까지 닉네임을 포함한 알림반환은 무의미합니다. 해쉬테이블을 만들어 record의 모든 문자열을 읽어들여 userID를 기준으로 닉네임을 추가하고 변경합니다. 이후 record를 한 번 더 읽어 명령문의 종류에 따라 userID를 기준으로 닉네임을 처리하고 반환합니다.
코드 전문 |
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
void parse_string(string &s, string &s1, string &s2, string &s3)
{
string temp_s;
s1 = s.substr(0, s.find(" "));
temp_s = s.substr(s.find(" ")+1, s.size()-1);
s2 = temp_s.substr(0, temp_s.find(" "));
s3 = temp_s.substr(temp_s.find(" ")+1, temp_s.size()-1);
}
vector<string> solution(vector<string> record) {
vector<string> answer;
string com_str, id_str, nname_str;
unordered_map<string, string> user_nname_tb;
for (auto s : record)
{
parse_string(s, com_str, id_str, nname_str);
if (com_str == "Enter")
{
user_nname_tb[id_str] = nname_str;
}
else if (com_str == "Change")
{
user_nname_tb[id_str] = nname_str;
}
}
for (auto s : record)
{
string temp_str = "";
parse_string(s, com_str, id_str, nname_str);
if (com_str == "Enter")
{
temp_str = user_nname_tb[id_str] + "님이 들어왔습니다.";
answer.emplace_back(temp_str);
}
else if (com_str == "Leave")
{
temp_str = user_nname_tb[id_str] + "님이 나갔습니다.";
answer.emplace_back(temp_str);
}
}
return answer;
}
느낀 점 (잡설 99% , 배운점 1%(많은 편)) |
이번 문제는 평상 시 오픈채팅방을 이용할 때도 자주 했던 생각이라 문제를 한 번 쭉 읽자마자
영감이 떠올랐습니다. Change를 change라 적어버린 탓에 조건문이 false가 되고 변경이 일어나지 않아 꽤 찾았습니다. 주의해야겠습니다.
예전에 풀었던 문제에서 쓴 find와 substr을 응용하여 파싱하였습니다. 다른 분은 sstream 라이브러리의 stringstream에 input을 넣어 공백으로 데이터를 구분하는 특성을 이용하여 파싱을 하였습니다. sstream은 생소한 라이브러리인데 한 번 기회가 된다면 공부해봐야겠습니다.
긴 글 읽어주셔서 감사합니다.
부족한 점이 있다면 부디 알려주시면 감사하겠습니다.
'알고리즘 부셔버렷 > ProblemSolving' 카테고리의 다른 글
[프로그래머스] 단체사진 찍기 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.06.01 |
---|---|
[프로그래머스] 카카오프렌즈 컬러링북 (해결과정, BFS, DFS 복기, C++) (0) | 2022.05.31 |
[프로그래머스] 문자열 압축 (문제 설명, 해결 과정, 코드 전문, C++) (0) | 2022.05.30 |
[프로그래머스] 1차 비밀지도 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.29 |
[프로그래머스] 실패율 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.29 |
댓글