게임 개발자(진)
Brain Backup
게임 개발자(진)
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • 언리얼엔진 (10)
    • 유니티 (19)
    • 운영체제 (0)
    • 알고리즘 (36)
      • 백준 문제풀이 (26)
      • 프로그래머스 문제풀이 (10)
    • 자료구조 (1)
    • Git (2)
    • C++ (15)
      • STL (10)
      • 기타 (5)
    • Python (9)
    • BackEnd (5)
      • IOCP게임서버 (5)
      • HTTP (0)
    • FrontEnd (12)
      • HTML (11)
      • CSS (1)
    • 프로젝트 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
게임 개발자(진)

Brain Backup

[C++] 프로그래머스-오픈채팅방 (Lv.2)
알고리즘/프로그래머스 문제풀이

[C++] 프로그래머스-오픈채팅방 (Lv.2)

2022. 8. 24. 08:24

문제 (level2, 2019 KAKAO BLIND RECRUITMENT)

문제 바로가기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

 

사용자를 실제로 구별하는 것은 [유저 아이디] 입니다. 

따라서 답을 내는데 필요한 것은, (유저 아이디, 닉네임) 이 짝지어서 필요합니다. 

 

이 경우, C++의 map을 사용하는 것이 이상적이라고 생각해서 사용했습니다. 

key값으로 유저아이디를,

value값에 해당 유저의 닉네임을 저장하기로 합니다.

 

 

 

 

map<string,string> mname;
    for(int i=0; i<record.size(); i++)
    {
        if(record[i][0]=='E') //Enter인 경우
        {
            int uid_start_pos=record[i].find(" ")+1;
            int uid_end_pos=record[i].find(" ",uid_start_pos);
            string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
            string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
        
            mname[uid]=nick_name; //최신으로 이름으로 업뎃
        }
        else if(record[i][0]=='C') //Change인 경우
        {
            int uid_start_pos=record[i].find(" ")+1;
            int uid_end_pos=record[i].find(" ",uid_start_pos);
            string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
            string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
            
            mname[uid]=nick_name; //최신으로 이름으로 업뎃
        }
    }

참고로 record는 문제에서 주어지는 인자입니다. (vector<string> record 형태로 주어집니다.) 

map<string,string> mname; 에다가 (유저아이디=key,닉네임=value) 형태로 저장합니다.

 

record의 처음부터 끝까지 for문으로 탐색하면서 

시작이 'E'라면 Enter~~~ 문장이기 때문에 닉네임이 바뀌었든 안바뀌었든 간에 업데이트를 해줍니다.

(닉네임이 변경되었나 여부를 확인하는게 오히려 더 시간적 손해가 크기 때문에 Enter때마다 해줌)

 

 

시작이 'C'라면 Change~~~문장이기 때문에 닉네임을 업데이트 해줍니다.

 

 

 

 

 vector<string> aws;
    for(int i=0; i<record.size(); i++)
    {
        int uid_start_pos=record[i].find(" ")+1;
        int uid_end_pos=record[i].find(" ",uid_start_pos);
        string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
        
        if(record[i][0]=='E')
        {
            string str=mname[uid]+"님이 들어왔습니다.";
            aws.push_back(str);
        }
        else if(record[i][0]=='L')
        {
            string str=mname[uid]+"님이 나갔습니다.";
            aws.push_back(str);
        }
    }
    
    return aws;

앞에서 (유저아이디,닉네임)의 최신 정보를 지닌 mname을 구했습니다. (map<string,string> mname;)

이제 벡터형태로 완전한 문장으로 바꿔서 저장해준 다음에 return만 해주면 됩니다. 

 

시작이 'E'라면 Enter~~~ 문장이기 때문에 닉네임(mname[uid])+님이 들어왔습니다.  를 push_back해줍니다.

 

시작이 'L'이라면 Leave~~~문장이기 때문에 닉네임(mname[uid])+님이 나갔습니다.  를 push_back 해줍니다.

 

시작이 'C'인 경우는 표시하지 않기때문에 (닉네임을 바꾼건 내부적으로 이루어짐) 무시해줍니다. 

 

그리고 완성된 vector<string>aws를 return 해주면 끝나게 됩니다.

 

 

 

 

 

 

 

#include <string>
#include <map>
#include <vector>

using namespace std;

vector<string> solution(vector<string> record) {
    map<string,string> mname;
    for(int i=0; i<record.size(); i++)
    {
        if(record[i][0]=='E') //Enter인 경우
        {
            int uid_start_pos=record[i].find(" ")+1;
            int uid_end_pos=record[i].find(" ",uid_start_pos);
            string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
            string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
        
            mname[uid]=nick_name; //최신으로 이름으로 업뎃
        }
        else if(record[i][0]=='C') //Change인 경우
        {
            int uid_start_pos=record[i].find(" ")+1;
            int uid_end_pos=record[i].find(" ",uid_start_pos);
            string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
            string nick_name=record[i].substr(uid_end_pos+1,record[i].size()-uid_end_pos-1);
            
            mname[uid]=nick_name; //최신으로 이름으로 업뎃
        }
    }
    
    vector<string> aws;
    for(int i=0; i<record.size(); i++)
    {
        int uid_start_pos=record[i].find(" ")+1;
        int uid_end_pos=record[i].find(" ",uid_start_pos);
        string uid=record[i].substr(uid_start_pos,uid_end_pos-uid_start_pos);
        
        if(record[i][0]=='E')
        {
            string str=mname[uid]+"님이 들어왔습니다.";
            aws.push_back(str);
        }
        else if(record[i][0]=='L')
        {
            string str=mname[uid]+"님이 나갔습니다.";
            aws.push_back(str);
        }
    }
    
    return aws;
}

최종코드입니다.


주의 사항

제가 처음에 문제를 이해를 제대로 하지 못해서 애먹었던 부분인데,

저는 유저 아이디가 uid~~~형식으로 고정돼있는줄 알았습니다. 

그러나 zxcv23같처럼 아무 형식이나 가능한 것으로 생각하고 문제를 풀어야 합니다. 

 

즉, 띄어쓰기를 기준으로 유저아이디를 찾아야합니다.

'알고리즘 > 프로그래머스 문제풀이' 카테고리의 다른 글

[C++] 멀쩡한 사각형 (Lv.2)  (0) 2022.08.30
[C++] 단체사진 찍기 (Lv.2)  (0) 2022.08.29
[C++] 카카오 프렌즈 컬러링북 (Lv.2)  (0) 2022.08.28
[C++] 문자열 압축 (Lv.2)  (0) 2022.08.24
[C++] 프로그래머스-두 큐 합 같게 만들기 (Lv.2)  (0) 2022.08.21
    '알고리즘/프로그래머스 문제풀이' 카테고리의 다른 글
    • [C++] 단체사진 찍기 (Lv.2)
    • [C++] 카카오 프렌즈 컬러링북 (Lv.2)
    • [C++] 문자열 압축 (Lv.2)
    • [C++] 프로그래머스-두 큐 합 같게 만들기 (Lv.2)
    게임 개발자(진)
    게임 개발자(진)
    공부한 내용을 기록하기 위한 블로그(게임프로그래밍이 주 분야)

    티스토리툴바