[JavaScript][Programmers] 오픈 채팅방

조준형·2021년 7월 12일
0

Algorithm

목록 보기
27/142
post-thumbnail

🔎 오픈 채팅방

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/64061

📄 제출 코드

// 모든 유저는 [유저 아이디]로 구분한다.
// [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
// [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
// [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
// 첫 단어는 Enter, Leave, Change 중 하나이다.
// 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
// 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
// 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
// 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.


function solution(record) {
    let answer = [];
    let user = {};
    let result = [];
    for (var i = 0; i < record.length; i++) {
        let temp = record[i].split(' ');
        let str = '';
        switch (temp[0]) {
            case 'Enter':
                str = `${temp[1]}님이 들어왔습니다.`
                user[temp[1]] = temp[2];
                answer.push(str);
                break;
            case 'Leave':
                str = `${temp[1]}님이 나갔습니다.`
                answer.push(str);
                break;
            case 'Change':
                user[temp[1]] = temp[2];
                break;
        }
        
        if (i == record.length - 1) {
            for (var j = 0; j < answer.length; j++) {
                let uid = answer[j].split('님')[0];
                result.push(answer[j].replace(uid, user[uid]));
                
            }
        }
        
    }
   
    answer = Array.from(result);
    console.log(typeof answer);
    return answer;
}

let record = ["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"];
console.log(solution(record));

들어오는 record의 글자에 따라 uid님이 ~~습니다.로 answer에 넣어놓고,
넣을 때 user객체의 value를 변경해준다.
그리고 마지막에 uid부분을 최종 value값으로 변경해준다.

다 풀고, 나갔습니다를 떠났습니다로 해놔서 10~20분정도 해맷다 ;;
(틀린글자 찾기)

📄 다른 코드

function solution(record) {
    let ret = []
    const uids = new Map()

    record.forEach(entry => {
        let [command, uid, nick] = entry.split(' ')
        if (command === 'Enter' || command === 'Change') uids.set(uid, nick)
    })

    record.forEach(entry => {
        let [command, uid] = entry.split(' ')
        if (command === 'Enter') ret.push(`${uids.get(uid)}님이 들어왔습니다.`)
        if (command === 'Leave') ret.push(`${uids.get(uid)}님이 나갔습니다.`)
    })

    return ret
}

다른 사람들의 풀이에서 본 코드인데 let [command, uid, nick] = entry.split(' ')이 렇게 나누어 Enter나 Change면 닉네임을 변경시켜, Enter나 leave에 따라 결과값을 도출해낸게 내 코드보다 깔끔해서 보기좋은거 같다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글