[프로그래머스 | 파이썬] 오픈채팅방

devheyrin·2022년 6월 15일
0

codingtest

목록 보기
58/65

드디어 2단계 진입! 🥳

문제 링크

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

코드

def solution(record):
    tmp = []
    user_dict = {}
    uid_arr = []
    
    for r in record:
        if r[0] == 'L':
            word, uid = r.split()
            tmp.append(['L', uid])
        if r[0] == 'E':
            word, uid, nickname = r.split()
            if uid not in uid_arr:
                tmp.append(['E', uid])
                user_dict[uid] = nickname
            else:
                user_dict[uid] = nickname
        if r[0] == 'C':
            word, uid, nickname = r.split()
            user_dict[uid] = nickname
            
    answer = []
    for word, uid in tmp:
        if word == 'E':
            answer.append(f'{user_dict[uid]}님이 들어왔습니다.')
        else:
            answer.append(f'{user_dict[uid]}님이 나갔습니다.')

    return answer

풀이 설명

문제에 충실하게 구현만 잘 하면 되는 문제였다!
닉네임 변경을 반영하기 위해 uid: nickname 을 기록할 수 있는 딕셔너리 하나,
한 번 등장했던 uid 인지 여부를 파악하기 위한 uid 기록 배열 하나를 준비한다.
tmp 배열에는 정답을 출력하기 위해 Enter / Leave 여부와 uid 를 기록한다. uid 만 기록해 두고, 배열이 완성되었을 때 최종적으로 수정된 닉네임을 넣어 출력하기로 한다.
이제 입력으로 주어진 배열을 순회하면서 Leave, Enter, Change 의 경우로 나누어 작업을 수행한다.
'Leave'라면 word, uid 만 주어지므로 해당 내용을 tmp 배열에 추가한다.
'Change'라면 user_dict의 uid:nickname 를 갱신해준다.
'Enter'라면 두 가지 경우의 수를 나누어 처리해야 한다.

  1. uid 가 최초 등장인 경우

이 경우 닉변을 위한 입장이 아니라 최초 입장하는 경우이므로 tmp 배열에 내용을 추가하고, user_dict에 uid:nickname 정보를 기록한다.

  1. 한번 이상 등장했던 uid인 경우

이 경우 닉변을 위한 입장으로 판단할 수 있으므로, tmp 배열에는 내용을 추가하지 않고 user_dict의 uid:nickname 만 갱신해준다.

tmp배열이 완성되면 이 배열을 순회하면서 uid자리에 알맞은 nickname 을 딕셔너리에서 찾아 넣어준다.

profile
개발자 헤이린

0개의 댓글