728x90
https://programmers.co.kr/learn/courses/30/lessons/42888
문제 풀이
가장 중요한 것은 중간 과정이 필요가 없어 최종 로그만 보이면 된다는 것이다.
ID 자체는 중복이 되면 안 되니 맵을 사용 해 ID : 별명 정보를 저장하였고,
벡터에는 ID : 명령 을 저장해서 최종 로그의 명령을 저장한다.
stringstream을 이용해서 string을 잘라준다.
tmp에는 명령어, id, 별명 순서로 저장되어 있다.
반복문을 통해서 명령어에 따라 맵과 벡터를 갱신한다.
명령어가 Enter라면 (id, 별명)을 맵에 갱신해주고 벡터에 (id, 명령)을 추가해준다.
Leave일 경우 따로 맵을 갱신할 필요는 없다. 단순히 벡터에 명령을 추가해준다.
그 외(Change)에는 별명만 다시 갱신해주면 된다.
반복문이 종료되었다면 처리 로그가 들어있는 벡터를 순회한다.
명령어가 Enter라면 벡터의 첫 번째 인수(ID)를 이용해
맵에 있는 value 값(nickname)을 가져와 뒤에 "님이 들어왔습니다." 추가하고 answer 벡터에 추가한다.
Leave라면 Enter와 동일하게 별명을 가져와 뒤에 "님이 나갔습니다."를 추가하고 answer 벡터에 추가해준다.
느낀 점
처음에 구현했던 코드는 stringstream을 사용하지 않아서 되게 코드가 깔끔하지 않았다. 이번 공부를 통해서 stringstream을 정리하는 기회를 가지게 되었다.
코드
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
map<string, string> m; // id : nickname 정보
vector<pair<string, string>> v; // id : instruction 정보
for (int i = 0; i < record.size();i++) {
string tmp[3]; // instruction + id + nickname
string token;
stringstream ss(record[i]);
int idx = 0;
while (ss >> token) {
tmp[idx++] = token;
}
if (tmp[0] == "Enter") {
m[tmp[1]] = tmp[2];
v.push_back(make_pair(tmp[1], tmp[0]));
}
else if (tmp[0] == "Leave") {
v.push_back(make_pair(tmp[1], tmp[0]));
}
else {
m[tmp[1]] = tmp[2];
}
}
for (auto i : v) {
if (i.second == "Enter") {
answer.push_back(m[i.first] + "님이 들어왔습니다.");
}
else if (i.second == "Leave") {
answer.push_back(m[i.first] + "님이 나갔습니다.");
}
}
return answer;
}
'문제 풀이 > 프로그래머스 (Programmers)' 카테고리의 다른 글
[C++] 프로그래머스 : 단체사진 찍기 (0) | 2021.09.30 |
---|---|
[C++] 프로그래머스 : 카카오프렌즈 컬러링북 (0) | 2021.09.22 |
[C++] 프로그래머스 : 문자열 압축 (0) | 2021.09.20 |
[C++] 프로그래머스 : 약수의 개수와 덧셈 (0) | 2021.09.13 |
[C++] 프로그래머스 : 키패드 누르기 (0) | 2021.09.13 |
댓글