본문 바로가기

프로그래머스 코딩 문제/카카오 기출문제

[프로그래머스] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT)

문제 링크 : 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;
}

 

궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.

 

 

 

반응형