

1. 문제 설명
채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열이 주어질 때, 모든 기록이 처리된 후 최종적으로 방을 개설한 사람이 보게 되는 메세지를 return
https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 문제 풀이법
문제에서 닉네임이 주어질때 그 옆에 uid가 함께 주어지는데 이를 활용하면 된다
주어진 배열 record를 먼저 순회하기 전에 pair이라는 벡터와 m이라는 맵을 하나 생성했는데, pair에는 first에는 실행할 명령어가 담기고 second에는 실행할 uid가 담긴다
그리고 맵의 key는 uid가, value는 닉네임을 저장하는데 Enter나 Change가 들어오면 key에 해당하는 value인 닉네임을 갱신해준다
예를 들어보자면, "Enter uid1234 Muzi"라는 명령어가 들어오면 pair("Enter", "uid1234")가 담긴다
map에는 m["uid1234"] = "Muzi" 가 담긴다
만일 "Change uid1234 hello"라는 명령어가 들어오면 map에는 m["uid1234"] = "hello"로 갱신된다
이후 record를 다 순회하면 새롭게 만들어진 pair 백터를 순회한다
pair 벡터를 순회하며 second에 저장되어있는 uid를 가지고 맵에 있는 닉네임값을 찾아서 first에 들어있는 명령어 맞게 result 문자열을 만들어주면 끝!
3. 소스 코드
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
vector<string> split(string str) {
vector<string> v;
istringstream iss(str);
string buffer;
while (getline(iss, buffer, ' '))
v.push_back(buffer);
return v;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<pair<string, string>> pair;
map<string, string> m;
for (int i = 0; i < record.size(); i++) {
vector<string> v = split(record[i]);
if (v[0].compare("Enter") == 0) {
pair.push_back(make_pair(v[0], v[1]));
m[v[1]] = v[2];
}
else if (v[0].compare("Leave") == 0) {
pair.push_back(make_pair(v[0], v[1]));
}
else if (v[0].compare("Change") == 0) {
m[v[1]] = v[2];
}
}
for (int i = 0; i < pair.size(); i++) {
string str = "";
if (pair[i].first.compare("Enter") == 0) {
str += m[pair[i].second];
str += "님이 들어왔습니다.";
} else {
str += m[pair[i].second];
str += "님이 나갔습니다.";
}
answer.push_back(str);
}
return answer;
}
'Algorithm Study' 카테고리의 다른 글
[프로그래머스] 3단계 - 야근 지수 (0) | 2024.03.19 |
---|---|
[프로그래머스] 2단계 - 연속 부분 수열 합의 개수 (0) | 2024.03.19 |
[프로그래머스] 2단계 - 뒤에 있는 큰 수 찾기 (0) | 2024.03.11 |
[프로그래머스] 2단계 - 더 맵게 (0) | 2024.03.11 |
[프로그래머스] 3단계 - 이중우선순위큐 (0) | 2024.03.09 |