반응형
문제 접근 방법
딕셔너리를 활용하여 uid별로 닉네임을 기록한뒤
출입로그를 최종 닉네임으로 나타낸다.
내가 생각한 work flow
- 닉네임의 변경은 'Enter' 또는 'Change'일 때만 일어나므로
해당 remark가 존재하면 닉네임을 다시 기록한다. - Change는 최종출력인 출입로그에 기록되지 않는다.
- 모든 닉네임 변경과정이 종료된 시점에서 출입로그의 닉네임을 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
반응형
'TIL' 카테고리의 다른 글
프로그래머스 - 소수찾기 (0) | 2021.04.29 |
---|---|
프로그래머스 - 스킬트리 (0) | 2021.04.29 |
프로그래머스 - 메뉴 리뉴얼 (0) | 2021.04.23 |
프로그래머스 - 괄호변환 (0) | 2021.04.15 |
프로그래머스 - 삼각 달팽이 (0) | 2021.04.14 |
댓글