728x90
level 2 : 오픈채팅방
https://programmers.co.kr/learn/courses/30/lessons/42888?language=cpp
코드
//프로그래머스 오픈채팅방
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
string in = "님이 들어왔습니다.";
string out = "님이 나갔습니다.";
//in out 문장
vector<string> solution(vector<string> record) {
vector<string> answer;
map<string, string> person; //아이디, 닉네임
vector<vector<string>> records;
for (int i = 0; i < record.size(); i++) {
string user[3]; //행동, 아이디, 닉네임 순으로 저장
int temp = 0;
for (int j = 0; j < record[i].size(); j++) {
if (record[i][j] == ' ') {
temp++;
continue;
}
user[temp] += record[i][j];
}
vector<string> user_vec;
user_vec.push_back(user[0]);
user_vec.push_back(user[1]);
user_vec.push_back(user[2]);
records.push_back(user_vec); //행동, 아이디, 닉네임 순으로 벡터에 저장
if (user[0] == "Enter" || user[0] == "Change") {
person[user[1]] = user[2]; //아이디에 해당하는 닉네임
}
}
for (int i = 0; i < records.size(); i++) {
if (records[i][0] == "Enter") {
//아이디에 해당하는 닉네임을 찾아 출력
answer.push_back(person[records[i][1]] + in);
}
else if (records[i][0] == "Leave") {
//아이디에 해당하는 닉네임을 찾아 출력
answer.push_back(person[records[i][1]] + out);
}
}
return answer;
}
int main() {
vector<string> record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
solution(record);
return 0;
}
설명
- 행동 아이디 닉네임 순으로 저장되어있는 string을 나눠서 user배열에 따로따로 저장해주고 records에 저장해준다.
- 행동이 Enter이거나 Change이면 map에서 아이디에 해당하는 닉네임을 바꿔준다.
- 다시 한번 반복하여 행동이 Enter일 때는 map에서 아이디에 해당하는 닉네임을 찾아 [닉네임] + "님이 들어왔습니다"라는 문구를 출력한다.
- 행동이 Leave일 때는 map에서 아이디에 해당하는 닉네임을 찾아 [닉네임] + "님이 나갔습니다."라는 문구를 출력한다.
고찰
record에 담긴 문자열을 바로바로 해석하여 결과를 출력해주었지만 그렇게 되면 같은 닉네임 다른 아이디는 구별을 하지 못하였다. 그래서 해쉬를 이용하여 아이디-닉네임을 연결하여 마지막에 어떤 아이디가 어떤 닉네임으로 연결되는지 확인하여 결과를 출력할 수 있었다.
다른 사람들이 푼 코드를 확인해보니 string을 자를때 stringstream을 사용하였다.
2021.08.22 - [알고리즘] - 알고리즘(C++) / string 자르기 : stringstream, 문자열 파싱istringstream, ostringstream에서 설명하겠다.
문제를 며칠전에 풀었더니 어떤 오류가 있었는지 잘 생각나지 않는다.. 바로바로 기록을 남기도록하자..
stringstream 사용 코드
//프로그래머스 오픈채팅방
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
string in = "님이 들어왔습니다.";
string out = "님이 나갔습니다.";
//in out 문장
vector<string> solution(vector<string> record) {
vector<string> answer;
map<string, string> person; //아이디, 닉네임
vector<vector<string>> records;
for (int i = 0; i < record.size(); i++) {
stringstream stream1(record[i]);
string move, id, nick;
stream1 >> move >> id >> nick;
vector<string> user_vec;
user_vec.push_back(move);
user_vec.push_back(id);
user_vec.push_back(nick);
records.push_back(user_vec); //행동, 아이디, 닉네임 순으로 벡터에 저장
if (move == "Enter" || move == "Change") {
person[id] = nick; //아이디에 해당하는 닉네임
}
}
for (int i = 0; i < records.size(); i++) {
if (records[i][0] == "Enter") {
//아이디에 해당하는 닉네임을 찾아 출력
answer.push_back(person[records[i][1]] + in);
}
else if (records[i][0] == "Leave") {
//아이디에 해당하는 닉네임을 찾아 출력
answer.push_back(person[records[i][1]] + out);
}
}
return answer;
}
int main() {
vector<string> record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
solution(record);
return 0;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
알고리즘(C++) / 프로그래머스 level 2 : 방금그곡 (0) | 2021.08.24 |
---|---|
알고리즘(C++) / 프로그래머스 level 2 : 메뉴 리뉴얼 (0) | 2021.08.23 |
알고리즘(C++) / 프로그래머스 level 3 : 베스트앨범 (0) | 2021.08.19 |
알고리즘(C++) / 프로그래머스 위클리 챌린지 2주차 : 상호평가 (0) | 2021.08.12 |
알고리즘(C++) / 프로그래머스 level 3 : 섬 연결하기 (0) | 2021.08.12 |
댓글