Jun 개발노트

프로그래머스 - KakaoChat

January 10, 2020

오픈채팅방

  1. 이해

    • 채팅방의 아이디 별 닉네임을 구하라
    • Change가 되면 닉네임이 바뀐다.
    • Leave면 닉네임이 없기 때문에 닉네임을 공란으로 바꾸지 않는다.
  2. 계획

    • Hash구조로 키 : 벨류 값으로 아이디를 구분
    • Map객체를 이용하여 중복값을 제거해준다.
    • 탬플릿 문자열을 이용하여 최종값을 내려준다.
  3. 실행

    const record = [
        "Enter uid1234 Muzi",
        "Change uid1234 Ryan",
        "Leave uid1234",
        "Enter uid4567 Prodo",
        "Enter uid1234 Prodo",
        "Leave uid4567"
    ];
    const result = [
        "Prodo님이 들어왔습니다.",
        "Prodo님이 나갔습니다.",
        "Prodo님이 들어왔습니다.",
        "Prodo님이 들어왔습니다.",
        "Prodo님이 나갔습니다."
    ];
    
    const OpenLastMember = record => {
        const divlist = record.map(v => v.split(" "));
        const map = new Map();
        const answer = [];
        divlist.map(v => {
            if (v[2]) map.set(v[1], v[2]);
        });
        divlist.map(v => {
            if (v[0] !== "Change") {
                let name = map.get(v[1]);
                answer.push(`${name}님이${v[0] === "Enter" ? " 들어왔습니다." : " 나갔습니다."}`);
            }
        });
        return answer;
    };
    
    const divRecord = rs => {
        return rs.map(v => v.split(" "));
    };
    
    const map = new Map();
    const removeRepetition = divlist => {
        const result = [];
        divlist.map(v => {
            if (v[2]) map.set(v[1], v[2]);
        });
        return map;
    };
    
    const makeAnswer = (divlist, map) => {
        const answer = [];
        divlist.map(v => {
            if (v[0] !== "Change") {
                let name = map.get(v[1]);
                answer.push(`${name}님이${v[0] === "Enter" ? " 들어왔습니다." : " 나갔습니다."}`);
            }
        });
        return answer;
    };
    
    describe("카카오 채팅", () => {
        it("최종", () => {
            expect(OpenLastMember(record)).toEqual(result);
        });
        it("분리하기", () => {
            expect(divRecord(record)).toEqual([
                ["Enter", "uid1234", "Muzi"],
                ["Change", "uid1234", "Ryan"],
                ["Leave", "uid1234"],
                ["Enter", "uid4567", "Prodo"],
                ["Enter", "uid1234", "Prodo"],
                ["Leave", "uid4567"]
            ]);
        });
        it("최종이름구하기", () => {
            expect(
                removeRepetition([
                    ["Enter", "uid1234", "Muzi"],
                    ["Change", "uid1234", "Ryan"],
                    ["Leave", "uid1234"],
                    ["Enter", "uid4567", "Prodo"],
                    ["Enter", "uid1234", "Prodo"],
                    ["Leave", "uid4567"]
                ])
            ).toEqual(map);
        });
        it("이름구하기", () => {
            expect(
                makeAnswer(
                    [
                        ["Enter", "uid1234", "Muzi"],
                        ["Change", "uid1234", "Ryan"],
                        ["Leave", "uid1234"],
                        ["Enter", "uid4567", "Prodo"],
                        ["Enter", "uid1234", "Prodo"],
                        ["Leave", "uid4567"]
                    ],
                    map
                )
            ).toEqual(result);
        });
    });
  4. 반성

    • 들어오는 input에 대해서 정확히 파악하자
    • Leave 면 NickName이 Undefined가 할당이 되어 시간이 오래 소요됨
    • undefined도 하나의 값으로 사용 될 수 있으며, 조건문을 통해 해결해줘야한다.
    • 템플릿연산자 안에서 표현식을 사용 할 수있다.

Written by Junho You 배운것을 기록하자