문제 링크 : programmers.co.kr/learn/courses/30/lessons/42888
단순한 문자열 문제이다. 하지만 map을 모르는 사람이라면 당황할 만 하다. 문자열과 닉네임을 단순한 배열에 쌍으로 저장한다면 아이디를 찾는데만 해도 존재하는 아이디 개수n 만큼 어마어마한 시간이 걸린다. 하지만 map으로 저장한다면 tree구조 이기때문에 logn이라는 짦은 시간이 걸린다.
<전체적인 알고리즘>
1. record를 차례대로 쭉 훑으면서 Enter일 경우 아이디와 닉네임을 쌍으로 저장하고 Change일 경우에는 갱신한다.
이렇게 한번 쭉 훑으면 결국 map에는 아이디에 대해 최신 닉네임이 저장된다.
2. 다시 record를 처음부터 쭉 훑으면서 명령어가 enter, leave일 경우만 최신 닉네임으로 출력해준다.
<전체 코드>
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
map<string, string> m;
void parsing(string str,vector<string> &v) //record를 명령어, 아이디, 닉네임 3개로 파싱
{
string tmp = "";
for (int i = 0; i < str.size(); i++)
{
if (str[i] == ' ') //공백이면 문자열 저장
{
v.push_back(tmp);
tmp = "";
}
else tmp += str[i]; //문자 더하기
}
if(tmp.size()>0) v.push_back(tmp); //닉네임 있으면 저장
}
vector<string> solution(vector<string> record) {
for (int i = 0; i < record.size(); i++)
{
vector<string> v;
parsing(record[i],v); //파싱하기
//v[0] 명렁어 // v[1] 아이디 // v[2] 닉네임
if (v[0].compare("Leave") != 0) //Leave명렁어가 아닐경우
{
m[v[1]] = v[2]; //map에 아이디와 닉네임 쌍으로 저장 // 바뀌면 갱신
}
}
vector<string> answer;
for (int i = 0; i < record.size(); i++)
{
vector<string> v;
parsing(record[i], v); //파싱 (아까 파싱해논걸 저장해놓으면 연산을 줄일 수 있지만 걍함.)
if (v[0].compare("Enter") == 0)
{
answer.push_back(m[v[1]] + "님이 들어왔습니다."); //m[v[1]] ->해당 아이디의 현재 닉네임
}
else if (v[0].compare("Leave") == 0)
{
answer.push_back(m[v[1]] + "님이 나갔습니다."); //m[v[1]] ->해당 아이디의 현재 닉네임
}
}
return answer;
}
궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.
반응형
'프로그래머스 코딩 문제 > 카카오 기출문제' 카테고리의 다른 글
[프로그래머스] 매칭 점수 (2019 KAKAO BLIND RECRUITMENT) (level 3) (0) | 2020.09.06 |
---|---|
[프로그래머스] 기둥과 보 설치 (2020 KAKAO BLIND RECRUITMENT) (level 3) (0) | 2020.09.03 |
[프로그래머스] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT) (0) | 2020.08.31 |
[프로그래머스] 괄호 변환 (2020 KAKAO BLIND RECRUITMENT) (0) | 2020.08.30 |
[프로그래머스] 단체사진 찍기 (2017 카카오코드 본선) (level 3) (0) | 2020.08.28 |