[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/42888
[풀이]
텍스트 추출 방식은 아래의 문제 풀이와 유사하다.
https://umtimos.tistory.com/143
[프로그래머스 Lv.2] [3차] 파일명 정렬
[문제]https://school.programmers.co.kr/learn/courses/30/lessons/17686 [풀이] 먼저 files의 값들에 대해, 정렬 기준인 두 가지(HEAD, NUMBER)를 추출한다. 이제 추출한 값을 FileData 구조체에 넣고, 이 구조체의 Head와 Num
umtimos.tistory.com
이제 추출을 완료한 데이터를 활용하여 로그를 만들어야하는데, 이를 위해 먼저 unordered_map<string, string> 형태의 해쉬맵을 만든다. 이것은 닉네임이 변경된 고유 아이디들을 기록하기 위한 것이다.
데이터를 정리한 DataTable vector를 선형 탐색하면서 Behavor에 해당하는 문구가 Enter나 Change일 경우, 해쉬맵의 유니크 아이디에 대한 닉네임을 기록해준다.
이제 로그 출력을 진행한다. 데이터를 정리한 DataTable vector를 선형 탐색 하면서 Enter와 Leave 경우가 있으면 해쉬맵에 해당하는 닉네임을 출력해주면 끝난다.
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
struct Data
{
string Behavior = "";
string UniqueID = "";
string NickName = "";
Data(string _Behavior, string _UniqueID, string _NickName)
: Behavior(_Behavior), UniqueID(_UniqueID), NickName(_NickName) {}
};
// record : 1이상 100,000이하
// record[i] : 입/출/변경, 고유아이디, 닉네임
// 입장 시 : "Enter [고유ID] [닉네임]"
// 퇴장 시 : "Leave [고유ID]"
// 닉네임 변경 시 : "Change [고유ID] [닉네임]"
vector<string> solution(vector<string> record)
{
vector<string> answer;
vector<Data> DataTable;
int Count = record.size();
for (int i = 0; i < Count; i++)
{
string Log = record[i];
string Behavior, UniqueID, NickName;
int Index = 0;
// Behavior 추출
while (' ' != record[i][Index])
{
Behavior += record[i][Index++];
}
++Index;
// UniqueID 추출
while (' ' != record[i][Index] && Log.size() > Index)
{
UniqueID += record[i][Index++];
}
if ("Leave" == Behavior)
{
DataTable.push_back(Data(Behavior, UniqueID, NickName));
continue;
}
else
{
++Index;
// Enter/Change일 경우, NickName 추출
while (Log.size() > Index)
{
NickName += record[i][Index++];
}
DataTable.push_back(Data(Behavior, UniqueID, NickName));
}
}
unordered_map<string, string> NickMap;
// 먼저 최신 닉네임을 기록
for (const Data& log : DataTable)
{
if (log.Behavior == "Enter" || log.Behavior == "Change")
{
NickMap[log.UniqueID] = log.NickName;
}
}
// 두 번째 루프: 출력 메시지 생성
for (const Data& log : DataTable)
{
if (log.Behavior == "Enter")
{
answer.push_back(NickMap[log.UniqueID] + "님이 들어왔습니다.");
}
else if (log.Behavior == "Leave")
{
answer.push_back(NickMap[log.UniqueID] + "님이 나갔습니다.");
}
}
// "record[i]님이 들어왔습니다." 형태로 return;
return answer;
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스 Lv.2] 2개 이하로 다른 비트 (0) | 2025.05.18 |
|---|---|
| [프로그래머스 Lv.2] [1차] 프렌즈4블록 (0) | 2025.05.16 |
| [프로그래머스 Lv.2] [3차] 파일명 정렬 (0) | 2025.05.15 |
| [프로그래머스 Lv.2] 2xn 타일링 (0) | 2025.05.15 |
| [프로그래머스 Lv.2] 숫자 변환하기 (0) | 2025.05.14 |