일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 병행성
- 그리디알고리즘
- 렌더링 파이프라인
- 락
- I/O장치
- DirectX12
- 다이나믹프로그래밍
- OS
- DirectX 12
- 병행성 관련 오류
- 쓰레드
- 알고리즘
- 멀티쓰레드
- 영속성
- 디자인패턴
- codility
- 파일시스템 구현
- 동적계획법
- 그리디 알고리즘
- 스케줄링
- 멀티프로세서
- directx
- 프로그래머스
- Direct12
- 타입 객체
- 백준
- 자료구조
- 운영체제
- 컨디션 변수
- 다이나믹 프로그래밍
Archives
- Today
- Total
기록공간
오픈채팅방 (프로그래머스) 본문
반응형
해결 방법
우선 record에 들어있는 문자열 형태의 원소를 행위, ID, 닉네임 이 세가지로 쪼개줘야 한다. 이때 sstream을 사용하면 편하게 쪼개줄 수 있다.
닉네임은 중복이 되어도 상관없고 ID를 기준으로 구분한다. 때문에 해쉬 테이블 특성을 이용하여 key값으로 id를 사용한다.
해쉬 테이블의 value값은 구조체로 string 타입의 닉네임과 들어왔는지 나갔는지를 검사하는 bool 타입 멤버변수를 가지고 있다.
(나간 id는 닉네임 변경이 불가능하기 때문에 들어왔는지 나갔는지를 검사하는 bool값이 필요하다)
찾은 id값이 Enter하는 경우 해쉬 테이블의 특성을 이용하여 그 id를 key값으로 하는 value 구조체에 닉네임을 부여하고 들어왔다는 체크를 한다.
이제 최종적인 닉네임 변경 적용이 완료되었고 이를 바탕으로 Enter 했는지, Leave 했는지 행동에 따라서 상태 메시지를 출력해주면 된다.
구현 코드는 다음과 같다.
#include <string>
#include <unordered_map>
#include <vector>
#include <sstream>
using namespace std;
enum type {DO = 0, ID, NICK, TYPE_END};
struct info {
string nickName;
bool isOn;
};
vector<string> solution(vector<string> record) {
vector<string> answer;
unordered_map<string, info> um;
string process[TYPE_END];
for(const auto iter : record) {
int i = 0;
stringstream ss(iter);
while(ss >> process[i++]);
if(process[DO] == "Enter") {
um[process[ID]].isOn = true;
um[process[ID]].nickName = process[NICK];
}
if(process[DO] == "Leave")
um[process[ID]].isOn = false;
if(process[DO] == "Change" && um[process[ID]].isOn)
um[process[ID]].nickName = process[NICK];
}
for(const auto iter : record) {
int i = 0;
stringstream ss(iter);
while(ss >> process[i++]);
string message = "";
if(process[DO] == "Enter")
message = um[process[ID]].nickName + "님이 들어왔습니다.";
if(process[DO] == "Leave")
message = um[process[ID]].nickName + "님이 나갔습니다.";
if(message.size() > 0)
answer.push_back(message);
}
return answer;
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
최대공약수와 최소공배수 (프로그래머스) - Java (0) | 2020.08.22 |
---|---|
키패드 누르기 (2020 카카오 인턴쉽) (0) | 2020.08.20 |
MinPerimeterRectangle (Codility) - Java (0) | 2020.08.18 |
CountFactors (Codility) (0) | 2020.08.11 |
MaxSliceSum (Codility) (0) | 2020.08.07 |
Comments