https://programmers.co.kr/learn/courses/30/lessons/42888
<풀이>
1. 주어진 명령(문자열)을 해독하여 각각 유저 아이디와 닉네임을 매칭한다.
2. 명령에 맞는 출력물을 결과에 저장한다.
<해법>
1. 문자열을 해독하는 방법.
=> 각 문자열은 공백으로 구분되어 있다고 합니다. 그렇다면, 문자열에서 공백까지 문자는 각각의 정보를 담고있다고 해석할 수 있습니다.
예를들어 "Enter uid1234 Muzi"의 문자열을 탐색할 때, 앞에서부터 공백이 나오기 전까지 한 문자씩 검사합니다.
E -> n -> t -> e -> r -> ' ' // 공백 발견
공백을 발견하였을 시 그 전까지 문자들 Enter을 저장합니다.
위와 같은 수행을 반복하면 Enter, uid1234, Muzi를 나눌 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
struct message {
string cmd;
string user_id;
};
vector<string> solution(vector<string> record) {
vector<string> answer;
map<string, string> user;
vector<message> v;
for (int i = 0; i < record.size(); i++) {
//문자열 분리
//tmpV[0] : Enter or Leave or tmpV, tmpV[1] : uidXXXX, tmpV[2] : nickname
vector<string> tmpV;
string tmp = "";
for (int j = 0; j < record[i].length(); j++) {
if (record[i][j] == ' ') {
tmpV.push_back(tmp);
tmp = "";
}
else {
tmp += record[i][j];
}
}
tmpV.push_back(tmp);
//명령 수행
if (tmpV[0] == "Enter") {
user[tmpV[1]] = tmpV[2];
v.push_back({ "Enter",tmpV[1] });
}
else if (tmpV[0] == "Leave") {
v.push_back({ "Leave", tmpV[1] });
}
else {
user[tmpV[1]] = tmpV[2];
}
}
//결과값 저장
for (int i = 0; i < v.size(); i++) {
if (v[i].cmd == "Enter") {
answer.push_back(user[v[i].user_id] + "님이 들어왔습니다.");
}
else {
answer.push_back(user[v[i].user_id] + "님이 나갔습니다.");
}
}
return answer;
}
|
문자열 파싱에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 - 실패율 (0) | 2020.05.15 |
---|---|
[C++] 프로그래머스 - 불량 사용자 (0) | 2020.05.15 |
[C++] 프로그래머스 - 튜플 (0) | 2020.05.07 |
[C++] 프로그래머스 - 크레인 인형뽑기 게임 (0) | 2020.05.07 |
[C++] 프로그래머스 - 외벽 점검 (0) | 2020.05.07 |