프로그래머스: 오픈채팅방

Song-Minhyung·2022년 6월 5일
0

Problem Solving

목록 보기
9/50
post-thumbnail

문제

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

입력: record
record는 아래와같이 생겼다.
[
"Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan",
]
첫번째 값은 Enter, Leave, Change 값중 하나가 입력된다.
두번쨰 값은 유저의 고유 식별번호가 입력된다.
세번째 값은 닉네임이 입력되거나 입력되지 않을 수 있다.

출력:
위와같이 입력하면
[
"Prodo님이 들어왔습니다.",
"Ryan님이 들어왔습니다.",
"Prodo님이 나갔습니다.",
"Prodo님이 들어왔습니다."
]
라고 출력된다.
이게 무슨의미냐면 유저를 닉네임이 아닌 고유식별번호로 구분을 해서
유저가 닉네임을 바꿔도 이전에 남았던 기록의 닉네임도 전부 바꾼다는 소리다.

위의 예를 본다면
1. uid 1234 가 Muzi 닉네임으로 입장
2. uid 4567 이 Prodo 닉네임으로 입장
3. uid 1234 가 떠남
4. uid 1234 가 Prodo 닉네임으로 변경해서 입장
5. uid 4567 이 Ryan 닉네임으로 변경

그래서 위와같은 출력이 나온다

문제풀이

function solution(record) {
    const dbId = {};
    const inOutRecord = [];
    const notice = [
        "님이 들어왔습니다.",
        "님이 나갔습니다."
    ]

    record.forEach( rcd => {
        const [state, uid, nickname] = rcd.split(" ");

        if (nickname) {
            dbId[uid] = nickname;
        }
        if (state === "Enter" || state === "Leave") {
            inOutRecord.push([uid, state]);
        }
    });

    console.log(inOutRecord);
    return inOutRecord.map( (rcd) => 
        `${dbId[rcd[0]]}${rcd[1] === "Enter" ? notice[0] : notice[1]}`
    );
}
  1. 입력된 값을 state, uid, nickname으로 split한다.
  2. dbId[uid]에 값이 없다면 넣고 있다면 변경한다.
  3. state가 Enter 혹은 Leave라면 inOutRecord에 uid, state를 기록한다.
  4. uid에 저장된 닉네임과 출력문구를 출력한다.
profile
기록하는 블로그

0개의 댓글