굥뷰를 햡시댜

[2018 Kakao Blind] 오픈채팅방 본문

알고리즘 문제 풀이/2019 Kakao Blind 문제 풀이

[2018 Kakao Blind] 오픈채팅방

GodZ 2019. 8. 7. 17:36

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

programmers.co.kr

 

시간이 꽤 걸린 문제다..

 

이유는 2가지였다.

 

1. 문자열 파싱이 익숙하지 않았다.

 

2. 이름을 바꾼 뒤의 결과를 고려해주는 부분을 생각해내는 것에서 시간을 많이 잡아먹었다.

 

만약 실제로 시험을 보는 상황이었다면 이 문제만 풀다가 시간을 보냈을 것 같다..

 

 

-문제 풀이

1. 입력으로 들어온 record를 각각 세 부분으로 나눠줬다.(명령, 아이디, 닉네임)

 

2. 각 명령에 따라 map에 새로 추가되거나 변경되거나 나갔을 경우의 아이디와 닉네임을 넣어주는 map 1개와 추가와 변경해줬을 경우만 고려한 map 1개를 선언해줬고 이에 맞게 map을 사용했다.

 

3. 각 명령에 따라 변경된 닉네임에 대한 명령을 answer에 추가해줬다.

 

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

map<string, string> m, m2;
vector<string> one, two, three;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    
    for (int i = 0; i < record.size(); i++) {

		string str = record[i];

		int f_pos = str.find(" ");

		string first = str.substr(0, f_pos);
		str = str.substr(f_pos + 1);

		int s_pos = str.find(" ");

		string second = str.substr(0, s_pos);
		str = str.substr(s_pos + 1);

		string third = "";
		if (first != "Leave") {
			int t_pos = str.find(" ");
			third = str.substr(0, t_pos);
			str = str.substr(t_pos + 1);
		}

		one.push_back(first);	//명령
		two.push_back(second);	//아이디
		three.push_back(third);	//닉네임
	}

	for (int j = 0; j < record.size(); j++) {
		if (one[j] == "Enter") {
			if (m.count(two[j]) != 0) {
				m[two[j]] = three[j];
				m2[two[j]] = three[j];
			}
			else {
				m.insert(make_pair(two[j], three[j]));
				if (m2.count(two[j]) != 0) {
					m2[two[j]] = three[j];
				}
				else m2.insert(make_pair(two[j], three[j]));
			}
		}
		else if (one[j] == "Leave") {
			three[j] = m[two[j]];
			m.erase(two[j]);
		}
		else if (one[j] == "Change") {
			m[two[j]] = three[j];
			m2[two[j]] = three[j];
		}
	}

	for (int j = 0; j < record.size(); j++) {
		if (one[j] == "Enter") {
			if (m[two[j]] != "")
				answer.push_back(m[two[j]] + "님이 들어왔습니다.");
			else
				answer.push_back(m2[two[j]] + "님이 들어왔습니다.");
		}
		else if (one[j] == "Leave") {
			if (m[two[j]] != "")
				answer.push_back(m[two[j]] + "님이 나갔습니다.");
			else
				answer.push_back(m2[two[j]] + "님이 나갔습니다.");
		}
	}
    
    return answer;
}
Comments