본문 바로가기
TIL

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

by Pig_CoLa 2021. 5. 12.
SMALL

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


문제 접근 방법

딕셔너리를 활용하여 uid별로 닉네임을 기록한뒤
출입로그를 최종 닉네임으로 나타낸다.

내가 생각한 work flow

  1. 닉네임의 변경은 'Enter' 또는 'Change'일 때만 일어나므로
    해당 remark가 존재하면 닉네임을 다시 기록한다.
  2. Change는 최종출력인 출입로그에 기록되지 않는다.
  3. 모든 닉네임 변경과정이 종료된 시점에서 출입로그의 닉네임을 uid에 맞게 작성한다.

완성한 솔루션

JavaScript

function solution(record) {
    // uid를 기준으로 닉네임을 수집한다.
    // (변경되었다면 최종만)
    let nicknameList = {};
    let greet = {
        'Enter': '들어왔습니다.',
        'Leave': '나갔습니다.'
    };

    let result = record.reduce((acc, val) => {
        // remark: 출입여부 또는 닉네임 변경 여부
        let [remark, uid, nickname] = val.split(' ');
        if (['Enter', 'Change'].includes(remark)) {
            // 닉네임 변경의 형태는 결국 remark가 'Enter'이거나 'Change'일 때만 일어난다.
            nicknameList[uid] = nickname;
        }
        if (['Enter', 'Leave'].includes(remark)) {
            // 닉네임 변경로그는 result에 나타나지 않는다.
            acc.push([remark, uid]);
        }
        return acc;
    }, []);

    // reduce할 때 같이 작업하지 않고 따로 map을 한번 더 쓰는 이유는
    // 닉네임이 최종적으로 변경된 상태를 result에 담기 위해서이다.
    // 즉, 가장 마지막 사건이 지난 시점으로 바라봐야 하기때문.
    let answer = result.map(([remark, uid]) => {
        return `${nicknameList[uid]}님이 ${greet[remark]}`;
    });

    return answer;
}

Python

from functools import reduce

def helper(nickname_list):
    def reducer(acc, val):
        # 나갈 경우('Leave')에는 nickname이 주어지지 않는다 == split할 경우 나올수 있는 최소 길이는 2이다.
        # 즉, 변수가 3개일 경우 그대로 사용하면 'ValueError: not enough values to unpack'
        # 와 같은 오류가 발생한다. 이를 해결해주기 위해 뒤에 split할 문자열과 동일한 문자열을 넣어준다.
        remark, uid, nickname, *_ = f'{val} '.split(' ')
        if remark in ['Enter', 'Change']:
            nickname_list[uid] = nickname
        if remark in ['Enter', 'Leave']:
            acc.append([remark, uid])
        return acc
    return reducer

def solution(record):
    nickname_list = {}
    greet = {
        'Enter': '들어왔습니다.',
        'Leave': '나갔습니다.'
    }

    result = reduce(helper(nickname_list), record, [])    
    answer = [f'{nickname_list[uid]}님이 {greet[remark]}' for remark, uid in result]
    return answer
LIST

'TIL' 카테고리의 다른 글

프로그래머스 - 소수찾기  (0) 2021.04.29
프로그래머스 - 스킬트리  (0) 2021.04.29
프로그래머스 - 메뉴 리뉴얼  (0) 2021.04.23
프로그래머스 - 괄호변환  (0) 2021.04.15
프로그래머스 - 삼각 달팽이  (0) 2021.04.14

댓글