Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 언리얼4
- Stimuli
- 코테
- ue4macro
- UnReal
- dfs
- 나나이트
- 코테연습
- EffectiveC++
- 문자열
- 알고리즘
- 언리얼
- c++
- 다이나믹프로그래밍
- UE5
- server
- Unity
- DP
- UMG
- 코딩테스트
- AIPerception
- 유니티
- uproperty
- 동적계획법
- UE4
- HTTP
- 재귀
- 프로그래머스
- blueprint
- Widget
Archives
- Today
- Total
공부 기록
[프로그래머스] level 2 - 오픈채팅방 (C++) 본문
문제 설명
카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.
신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.
"[닉네임]님이 들어왔습니다."
채팅방에서 누군가 나가면 다음 메시지가 출력된다.
"[닉네임]님이 나갔습니다."
채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.
- 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
- 채팅방에서 닉네임을 변경한다.
닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.
제한사항
- record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
- 다음은 record에 담긴 문자열에 대한 설명이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
- [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
- [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
- 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
문제 풀이
#include <string>
#include <sstream>
#include <vector>
#include <map>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
// id와 닉네임 map 생성
map<string, string> nickname;
// record 문자열 분할
string action, id, name;
for (int i = 0; i < record.size(); i++)
{
istringstream ss(record[i]);
ss >> action >> id >> name;
if (action == "Enter") {
nickname[id] = name;
answer.push_back(id + "님이 들어왔습니다.");
}
else if (action == "Leave") {
answer.push_back(id + "님이 나갔습니다.");
}
else if (action == "Change") {
nickname[id] = name;
}
}
for (int i = 0; i < answer.size(); i++)
{
int len;
string key;
len = answer[i].find("님"); // ~님 바로 앞까지가 id 길이
key = answer[i].substr(0, len);
answer[i].replace(0, len, nickname[key]);
}
return answer;
}
- isstrinstream 은 string을 공백단위로 쪼개 저장함. >> 를 통해 여러 string 변수에 한번에 저장 가능
- map.insert( )는 이미 존재하는 key 값을 넣으면 반영하지 않음. map[key] = value를 통해 초기화 및 업데이트 모두 가능
- string.find ("") : 전체 문자열 중 찾고 싶은 특정 문자열의 첫번째 인덱스 반환
- string.substr(a,b, "") : a번 인덱스부터 시작하는 길이 b의 문자열을 원하는 문자열로 교체
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] level 1 - 숫자 문자열과 영단어 (C++) (0) | 2022.02.16 |
---|---|
[프로그래머스] level 3 - 추석 트래픽 (C++) (1) | 2022.02.16 |
[프로그래머스] level 2 - 문자열 압축 (C++) (0) | 2022.02.16 |
[프로그래머스] level 1 - 신규 아이디 추천 (C++) (0) | 2022.02.12 |
[프로그래머스] level 1 - 신고 결과 받기 (C++) (0) | 2022.02.11 |
Comments