ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 2019 KAKAO BLIND RECRUITMENT ][ C++ ] 오픈채팅방
    Algorithm/프로그래머스 2020. 5. 7. 18:22

     

     stringstream  을 이용하면 C의 strtok와 같이 공백 문자를 기준으로 string을 자를 수 있다.

    이를 사용하기 위해서는  #include sstream  를 선언해야 한다.

    이 문제를 풀 때 가장 고민했던 점이 공백 문자를 기준으로 문자열을 어떻게 쉽게 나눌 수 있을까 였는데 strtok를 쓰는 것보다 stringstream 클래스를 이용하면 문자열 처리가 쉬워진다.

     

     

     

     Code

     

     Strtok를 사용하는 방법

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    #include <map>
    
    using namespace std;
    
    map<string, string> m;
    vector<string> rec;
    
    // 문자열 자르기
    void splite(vector<string> record) {
    	char *str = new char[100];
    
    	for (int i = 0; i < record.size(); i++) {
    		strcpy(str, record[i].c_str());
    
    		char *tok = strtok(str, " ");
    		while (tok != NULL) {
    			rec.push_back(string(tok));
    			tok = strtok(NULL, " ");
    		}
    	}
    }
    
    vector<string> solution(vector<string> record) {
    	vector<string> answer;
    
    	// 문자열 자르기
    	splite(record);
    
    	for (int i = 0; i < rec.size(); ) {
    		if (rec[i].substr(0, 1).compare("E") == 0) {
    			auto iter = m.find(rec[i + 1]);
    			if (iter != m.end()) {
    				iter->second.clear();
    				iter->second = rec[i + 2];
    			}
    			else {
    				m.insert(make_pair(rec[i + 1], rec[i + 2]));
    			}
    			i += 3;
    		}
    		else if (rec[i].substr(0, 1).compare("C") == 0) {
    			auto iter = m.find(rec[i + 1]);
    			if (iter != m.end()) {
    				iter->second.clear();
    				iter->second = rec[i + 2];
    			}
    			i += 3;
    		}
    		else if (rec[i].substr(0, 1).compare("L") == 0) {
    			i += 2;
    		}
    	}
    
    	for (int i = 0; i < rec.size(); ) {
    		auto iter = m.find(rec[i + 1]);
    		if (rec[i].substr(0, 1).compare("E") == 0) {
    			answer.push_back(iter->second + "님이 들어왔습니다.");
    			i += 3;
    		}
    		else if (rec[i].substr(0, 1).compare("C") == 0) {
    			i += 3;
    		}
    		else if (rec[i].substr(0, 1).compare("L") == 0) {
    			answer.push_back(iter->second + "님이 나갔습니다.");
    			i += 2;
    		}
    	}
    
    	return answer;
    }
    
    int main() {
    	vector<string> record = {
    		"Enter uid1234 Muzi",
    		"Enter uid4567 Prodo",
    		"Leave uid1234",
    		"Enter uid1234 Prodo",
    		"Change uid4567 Ryan"
    	};
    
    	vector<string> res = solution(record);
    
    	return 0;
    }

     

     stringstream을 사용하는 방법

    #include <iostream>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <map>
    using namespace std;
    
    vector<string> solution(vector<string> record) {
    	vector<string> answer;
    	string command;
    	string ID;
    	string uid;
    	map<string, string> m;
    
    	for (string input : record) {
    		stringstream ss(input);
    		ss >> command;
    		ss >> uid;
    		if (command == "Enter" || command == "Change") {
    			ss >> ID;
    			m[uid] = ID;
    		}
    	}
    
    	for (string input : record) {
    		stringstream ss(input);
    		ss >> command;
    		ss >> uid;
    		if (command == "Enter") {
    			ID = (m.find(uid)->second);
    			answer.push_back(ID + "님이 들어왔습니다.");
    		}
    		else if (command == "Leave") {
    			ID = (m.find(uid)->second);
    			answer.push_back(ID + "님이 나갔습니다.");
    		}
    	}
    	return answer;
    }

     

     

    댓글

Designed by Tistory.