본문 바로가기

알고리즘/프로그래머스

[프로그래머스/C++] 알고리즘 - 오픈 채팅방

안녕하세요! 테크지니어22입니다.

오늘은 프로그래머스 알고리즘 오픈 채팅방을  풀어보도록 하겠습니다.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

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

programmers.co.kr

[문제 접근]

이 문제는 문자열을 활용한 구현문제입니다. 유저아이디값이 있고, 이에 매칭되는 닉네임이 변경되는 문제이기 때문에 unorded_map을 활용하여 풀었습니다.

 

[풀이 전략]

1. c++은 split함수가 없기 때문에 직접 구현합니다.

2. for문을 돌면서

- Enter와 Change에 해당되면 해쉬맵의 키는 유저아이디, 값은 닉네임으로 설정해줍니다.

- Change를 제외하고 새로운 recordList에 삽입합니다.

3. recordList를 돌면서 Enter와 Leave를 출력값의 문자열에 대응하여 answer에 삽입합니다.

 

[코드]

문자열 split 함수

// split 함수
vector<string> split(string &s, string &sep) {
	vector<string> ret;
	int pos = 0 ;
	while(pos < s.size() ) {
		int nxt_pos = s.find(sep, pos); // pos번째 인덱스부터 sep가 시작하는 위치를 반환.
		if(nxt_pos == -1) nxt_pos = s.size();
		if(nxt_pos - pos > 0) ret.push_back(s.substr(pos, nxt_pos - pos));
		pos = nxt_pos + sep.size();
	}
	return ret ;
}

 

최종 코드

vector<string> solution(vector<string> record) {
    vector<string> answer;
    unordered_map<string,string> m;
    vector<vector<string>> recordList ; 

    for(string &e : record) {
        string sep = " ";
        auto temp = split(e,sep);
        if(temp[0] != "Leave"){
            m[temp[1]] = temp[2];
        } 
        if(temp[0] != "Change") recordList.push_back(temp);
    }
    
    for(vector<string> &e : recordList) {
        string str = "" ;
        if(e[0] == "Enter") {
            str = m[e[1]] + "님이 들어왔습니다.";
        }
            else {
            str = m[e[1]] + "님이 나갔습니다.";
            }
        answer.push_back(str);
    }
    
    
    
    return answer;
}

 

[배울 점]

- split 함수코드 숙지하기