Problem Solving/Programmers

[프로그래머스] 오픈채팅방

jujube bat 2020. 5. 4. 18:19

✔️ 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


✔️ 풀이

- map<유저아이디, 닉네임>을 사용한다.

- 채팅방에 들어오거나(Enter) 닉네임을 바꿀때(Change) 유저 아이디를 key 값으로 사용해서 닉네임을 바꿔준다.


✔️ 문제 회고

- map을 이용하는 문제였다. 

- istringstream을 사용해서 공백을 기준으로 문자열을 손쉽게 자를 수 있다. 


👨🏻‍💻 소스 코드 

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

using namespace std;

vector<string> solution(vector<string> record) {
	map<string, string> userMap;
	vector<vector<string>> log;

	for (int i = 0; i < record.size(); i++) { // 문자열을 공백을 기준으로 자른다. 
		vector<string> elements;
		string tmp = "";

		for (int j = 0; j <= record[i].size(); j++) {
			if (record[i][j] == ' ' || j == record[i].size()) {
				elements.push_back(tmp);
				tmp = "";
			}
			else {
				tmp += record[i][j];
			}
		}

		if(elements.size() >=3) 
			userMap[elements[1]] = elements[2];

		log.push_back(elements); //문자열을 공백을 기준으로 잘라서, vector로 만들어 log에 추가한다.
	}

	vector<string> ret;

	// log를 순회하면서 결과를 출력한다.
	for (int i = 0; i < log.size(); i++) {
		if (log[i][0] == "Enter") {
			ret.push_back(userMap[log[i][1]] + "님이 들어왔습니다.");
		}
		else if (log[i][0] == "Leave") {
			ret.push_back(userMap[log[i][1]] + "님이 나갔습니다.");
		}
	}

	return ret;
}

👨🏻‍💻 개선된 소스 코드 

#include <string>
#include <vector>
#include <sstream>
#include <map>

using namespace std;

vector<string> solution(vector<string> record) {
	vector<string> answer;
	vector<vector<string>> log(record.size(), vector<string>(3));
	map<string, string> userMap;

   // istringstream을 사용하면 정말 간편하게 공백을 기준으로 문자열을 자를 수 있다. 
	for (int i = 0; i < record.size(); i++) {
		istringstream iss(record[i]);

		iss >> log[i][0];
		iss >> log[i][1];
		iss >> log[i][2];

		if (log[i][0] == "Enter" || log[i][0] == "Change") {
			userMap[log[i][1]] = log[i][2];
		}

	}

	for (int i = 0; i < log.size(); i++) {
		if (log[i][0] == "Enter") {
			answer.push_back(userMap[log[i][1]] + "님이 들어왔습니다.");
		}
		else if (log[i][0] == "Leave") {
			answer.push_back(userMap[log[i][1]] + "님이 나갔습니다.");
		}
	}

	return answer;
}