가치투자자

[프로그래머스] 오픈채팅방 본문

Problem Solving/Programmers

[프로그래머스] 오픈채팅방

미주민 2023. 7. 13. 01:07
728x90
반응형

Programmers : 오픈채팅방

🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

</> 이 글은 코딩테스트 대비와 알고리즘 공부를 위해 문제를 풀고 학습한 내용을 기록한 것입니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️

 


💬 문제

유저 아이디와 닉네임이 서로 한 쌍이고, 유저 아이디를 활용해 닉네임을 변경할 수 있다는 것만 파악하면 쉽게 풀 수 있는 문제였다.

 

  1. 오픈채팅방에서 닉네임을 바꾸는 방법은 2가지다. 닉네임을 변경하면 기존 메시지의 닉네임도 변경된다.

    - 채팅방을 나간 후, 새로운 닉네임으로 다시 들어온다

    - 채팅방에서 닉네임을 변경한다

  2. 중복된 닉네임을 사용할 수 있다.

    - 그렇기에 모든 유저는 [유저 아이디]로 구분한다

  3. 입장, 퇴장, 변경에 대한 기록 record 메시지는 다음과 같이 주어진다.

    - 입장 : "Enter [유저 아이디] [닉네임]"

    - 퇴장 : "Leave [유저 아이디]"

    - 변경 : "Change [유저 아이디] [닉네임]"

  4. 입장, 퇴장시 다음과 같은 메시지가 출력되며, 최종적으로 보게 될 메시지를 배열 형태로 출력해주면 된다.

    - 입장 : "[닉네임]님이 들어왔습니다."

    - 퇴장 : "[닉네임]님이 나갔습니다."

 

728x90

 


💡 입출력 예시

처음에는 Muzi(uid1234)가 들어왔고, 그 다음으로 Prodo(uid4567)가 들어왔다.

그리고 Muzi(uid1234)가 퇴장하고, Prodo라는 닉네임으로 바꿔서 uid1234가 들어왔다.

마지막으로, uid4567이 닉네임을 Ryan으로 변경했다.

최종적으로, uid1234의 닉네임은 Prodo이고, uid4567의 닉네임은 Ryan이다.
이전 입장/퇴장 메시지의 닉네임을 최종 닉네임으로 바꿔주면 된다.

 

 

반응형

 


🔑 풀이1 : 객체

유저의 닉네임을 변경하기 위해 객체를 활용했다.

유저 아이디를 객체의 key값으로, 닉네임을 value값으로 설정했다.

 

  • 유저 정보를 받아와 명령어(command), 유저 아이디(uid), 닉네임(nickname)으로 구조분해할당을 해준다.

  • 명령어

    1) 입장(Enter) : 유저정보(userInfo)에 uid와 nickname을 key와 value로 넣어준다

        - 입장 메시지 "uid님이 들어왔습니다"를 배열 ans에 넣어준다

    2) 변경(Change) : 해당 uid의 value값을 새로운 닉네임으로 바꿔준다

    3) 퇴장(Leave) : "uid님이 나갔습니다"를 배열 ans에 넣어준다

  • 현재까지는 아이디로 입장/퇴장 메시지가 저장된 상태이다.

    - 각 유저 아이디를 최종 닉네임으로 변경해주고, 최종 메세지 배열을 출력해준다
function solution(record) {
    const userInfo = {};
    const ans = [];
    
    // 유저 정보
    record.map((item) => {
        const [command, uid, nickname] = item.split(' ');
        
        if (command === 'Enter') {
            userInfo[uid] = nickname;
            ans.push(`${uid}님이 들어왔습니다.`);
        } else if (command === 'Change') {
            userInfo[uid] = nickname;
        } else if (command === 'Leave') {
            ans.push(`${uid}님이 나갔습니다.`);
        }
    });
    // 입장, 퇴장 기록
    for (let i=0; i < ans.length; i++) {
        let uid = ans[i].split('님')[0];
        ans[i] = ans[i].replace(uid, userInfo[uid]);
    }
    return ans;
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

728x90
반응형