-
[ 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; }
'Algorithm > 프로그래머스' 카테고리의 다른 글
[ 2018 KAKAO BLIND RECRUITMENT ] 뉴스 클러스터링 (0) 2020.09.02 [ 2018 KAKAO BLIND RECRUITMENT ] 추석 트래픽 (0) 2020.08.29 [ Summer/Winter coding 2019 ] 종이접기 (0) 2020.05.19 [ 2020 KAKAO BLIND RECRUITMENT ] 자물쇠와 열쇠 (0) 2020.03.12 [ 2020 KAKAO BLIND RECRUITMENT ] 괄호 변환 (0) 2020.03.11