728x90

오픈채팅방

 

프로그래머스

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

programmers.co.kr

문제 설명

사용자의 idkey값으로 가지며 사용자의 행동에 따라 변하는 결과를 출력하는 문제다.

이미지의 예시가 정확한 설명을 해주고 있다.

문제 풀이

소스코드 : C++

  1. record에 기록된 행동들에 대해 split을 해주어 vector<string> tmp 에 순서대로 담아준다.
  2. 명령에 따라 조건을 처리해준다.
    1. Enter 라면 idkey값으로 하고 nicknamevalue로 하는 unordered_map에 넣어주고 q{id , "님이 들어왔습니다."}를 푸시해준다.
      이때 이미 존재하는 key라면 nickname을 변경해준다.
    2. Leave 라면 q{id , "님이 나갔습니다."}를 푸시해준다.
    3. Change 라면 unordered_map에 존재하는 idvalue를 새로운 nickname으로 변경해준다.
  3. 위 과정을 반복하여 record 사이즈만큼 반복해준다.
  4. q에서 하나씩 꺼내면서 해당 idunordered_map에 있는 value로 모두 바꾸어 answer에 넣어준다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <unordered_map>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    unordered_map<string, string> um;   // key = id value = 닉네임
    queue<pair<string,string>> q;
    for(int i=0; i<record.size(); i++){
        vector<string> tmp(3,"");
        int idx=0;
        for(int j=0; j<record[i].size(); j++){
            char c = record[i][j];
            if(c==' ') idx++;
            else tmp[idx]+=c;
        }
        string cmd = tmp[0];
        string id , nick;
        if(cmd == "Enter"){
            id = tmp[1], nick = tmp[2];
            if(um.find(id)==um.end())
                um.insert({id,nick});
            else um[id] = nick;
            q.push({id,"님이 들어왔습니다."});
        }
        else if(cmd == "Leave"){
            id = tmp[1];
            q.push({id,"님이 나갔습니다."});
        }
        else{
            id = tmp[1], nick = tmp[2];
            um[id] = nick;
        }
    }

    while(!q.empty()){
        pair<string, string> cur = q.front();
        q.pop();
        answer.push_back(um[cur.first]+cur.second);
    }
    return answer;
}

소스코드 : Python

C++과 큰 차이는 없지만 이번에는 record 기준으로 문제를 풀었다.

  1. record를 탐색하면서 split 을 하고
    1. Enter 또는 Chage인 경우에 idkey 값으로하는 딕셔너리 mvalue값을 갱신해준다.
  2. 위 과정을 반복하고 다시 한 번 record를 탐색한다.
  3. 명령이 Change가 아닌 경우에 미리 지정해 두었던 딕셔너리 printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}를 이용하여 mvalue 값 + printvalue값 을 answer에 넣어준다.
def solution(record):
    answer = []
    m = {}
    printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
    for r in record:
        tmp = r.split(' ')
        if tmp[0] in ['Enter', 'Change']:
            m[tmp[1]] = tmp[2]

    for r in record:
        if r.split(' ')[0] != 'Change':
            answer.append(m[r.split(' ')[1]] + printer[r.split(' ')[0]])

    return answer

input_record = ["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]
print(solution(input_record))
728x90
300x250
WONILLISM