Problem Solving/Programmers
[프로그래머스] 오픈채팅방
jujube bat
2020. 5. 4. 18:19
✔️ 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔️ 풀이
- map<유저아이디, 닉네임>을 사용한다.
- 채팅방에 들어오거나(Enter) 닉네임을 바꿀때(Change) 유저 아이디를 key 값으로 사용해서 닉네임을 바꿔준다.
✔️ 문제 회고
- map을 이용하는 문제였다.
- istringstream을 사용해서 공백을 기준으로 문자열을 손쉽게 자를 수 있다.
👨🏻💻 소스 코드
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<string> solution(vector<string> record) {
map<string, string> userMap;
vector<vector<string>> log;
for (int i = 0; i < record.size(); i++) { // 문자열을 공백을 기준으로 자른다.
vector<string> elements;
string tmp = "";
for (int j = 0; j <= record[i].size(); j++) {
if (record[i][j] == ' ' || j == record[i].size()) {
elements.push_back(tmp);
tmp = "";
}
else {
tmp += record[i][j];
}
}
if(elements.size() >=3)
userMap[elements[1]] = elements[2];
log.push_back(elements); //문자열을 공백을 기준으로 잘라서, vector로 만들어 log에 추가한다.
}
vector<string> ret;
// log를 순회하면서 결과를 출력한다.
for (int i = 0; i < log.size(); i++) {
if (log[i][0] == "Enter") {
ret.push_back(userMap[log[i][1]] + "님이 들어왔습니다.");
}
else if (log[i][0] == "Leave") {
ret.push_back(userMap[log[i][1]] + "님이 나갔습니다.");
}
}
return ret;
}
👨🏻💻 개선된 소스 코드
#include <string>
#include <vector>
#include <sstream>
#include <map>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<vector<string>> log(record.size(), vector<string>(3));
map<string, string> userMap;
// istringstream을 사용하면 정말 간편하게 공백을 기준으로 문자열을 자를 수 있다.
for (int i = 0; i < record.size(); i++) {
istringstream iss(record[i]);
iss >> log[i][0];
iss >> log[i][1];
iss >> log[i][2];
if (log[i][0] == "Enter" || log[i][0] == "Change") {
userMap[log[i][1]] = log[i][2];
}
}
for (int i = 0; i < log.size(); i++) {
if (log[i][0] == "Enter") {
answer.push_back(userMap[log[i][1]] + "님이 들어왔습니다.");
}
else if (log[i][0] == "Leave") {
answer.push_back(userMap[log[i][1]] + "님이 나갔습니다.");
}
}
return answer;
}