My Boundary As Much As I Experienced

(KAKAO BLIND RECRUITMENT) 오픈채팅방 본문

Algorithm/Coding Test

(KAKAO BLIND RECRUITMENT) 오픈채팅방

Bumang 2023. 7. 15. 14:46

 

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

 

프로그래머스

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

programmers.co.kr

 

문제 수준:

레벨2

 

입출력 예 (입력 / 출력):

["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

 

문제 요약:

사용자가 할 수 있는 액션:

1. 사용자는 원하는 닉네임으로 입장할 수 있다.

2. 사용자는 입장 후 원하는 닉네임으로 변경할 수 있다.

3. 사용자는 퇴장할 수 있다.

4. 닉네임은 중복될 수 있다.

 

이 조건을 가지고 불특정 다수가 채팅할 수 있는 앱을 만들 때, 입장 메시지와 퇴장 메시지를 출력해야 된다.

이 메시지들은 닉네임을 변경할 시 메시지도 같이 바뀐다.

 

 

문제 풀이 전략

닉네임을 변경하거나, 중복이 가능하므로 입/퇴장때의 이름을 고유한 값으로 쓸 수 없다.

UID를 기준으로 가장 최근의 닉네임을 객체에 저장하여 메시지를 표출할 때만 아이디를 닉네임으로 변환하려 한다.

 

 

내 풀이:

function solution(record) {
    const current = {} //마지막으로 변경된 닉네임을 아이디(고유값) : 닉네임(중복 가능한 값) 꼴로 저장한다.
    const enterLine = "님이 들어왔습니다."
    const leaveLine = "님이 나갔습니다."
    const temp = [] //[아이디, 행동]꼴로 log를 저장하는 곳.
    const result = [] //문제에서 요구한대로 배열 형태로 return해야되기 때문에 포맷에 맞춰 정제한 배열
    
    
    for (let i = 0; i < record.length; i++){
        const spl = record[i].split(" ") //입력값을 스페이스를 기준으로 나눈다.
        if (spl[0] !== "Leave"){ // 액션이 Leave가 아닐때만,
            current[spl[1]] = spl[2]
            /* current 객체에 '아이디 : 닉네임'으로 업데이트 한다.
            Leave할 때는 닉네임이 데이터에 제공되지 않기 때문에 하지 않는다..*/
        }
        
        if (spl[0] === "Change") {
            continue //단순 닉네임 변경일 때는 들어오기/나가기 메시지에 업데이트하지 않고 continue 
        } else
        if (spl[0] === "Enter") { // 유저가 들어온 경우이면
            temp.push([spl[1] , enterLine]) // [아이디, 입장 메시지] 꼴로 temp에 저장한다. 
        } else { // 유저가 나간 경우는
            temp.push([spl[1] , leaveLine]) // [아이디, 퇴장 메시지] 꼴로 temp에 저장한다. 
        }
    }
    temp.forEach( list => {
        result.push(current[list[0]] + list[1])
        //아이디로 최근 닉네임을 객체에서 가져와 입/퇴장 메시지와 조립하여 result에 넣는다.
    })
    return result //result를 반환
}

오픈채팅을 평소에 많이 사용해봐서(그림방, 코딩방) 메커니즘을 이해하는데에 어려움은 없었다.