본문 바로가기
코딩테스트

[프로그래머스] 오픈채팅방 / Python

by wonseok99 2021. 11. 5.

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

문제풀이

단순히 문자열 파싱을 통해 문제를 해결하였다.

- 주의할 점

  1. 닉네임 변경시, 최종 출력 메시지의 닉네임도 모두 변경된다.
  2. 닉네임은 중복 가능하지만, uid는 고유값이므로 중복되지 않는다.

 

 

 

코드

def solution(record):
    user = {}
    result = []
    answer = []
    for rec in record:
        rec = rec.split(' ')

        if rec[0] == "Enter":
            user[rec[1]] = rec[2]
            result.append((rec[1], "Enter"))
        if rec[0] == "Leave":
            # del(user[rec[1]])
            result.append((rec[1], "Leave"))
        if rec[0] == "Change":
            user[rec[1]] = rec[2]

    for res in result:
        if res[1] == "Enter":
            answer.append(user.get(res[0]) + "님이 들어왔습니다.")
        if res[1] == "Leave":
            answer.append(user.get(res[0]) + "님이 나갔습니다.")

    return answer

 

먼저 입력받은 record 값들을 .split(' ')을 사용하여 공백을 기준으로 문자열을 나누어 rec에 저장해 줍니다.

조건문을 사용하여 rec[0]의 상태에 따라 처리를 해줍니다.

딕셔너리를 사용하여 유저들의 정보를 저장해줍니다.
ex_ {uid:name}
닉네임을 변경할 경우 uid를 통해 Key값을 찾아 Value값만 수정해주면 됩니다.

최종적으로 결과에 담아야하는 출력로그를 얻기위해선 Key값의 중복을 허용하지 않는 딕셔너리를 사용할 수 없습니다.

따라서 추가적으로 (uid,상태) 형식의 튜플을 리스트에 따로 저장해줍니다.

기록처리가 끝난 후,  조건에 따라 딕셔너리에 저장되어있는 회원의 uid(Key)를 get을 사용하여 최종적으로 저장된 회원들의 name을 가져와 answer에 저장해줍니다.

 

- 코딩시 주의점

회원의 방을 나갔을 때 del(dict)를 사용하여 회원의 정보를 제거하였는데, 회원 한명만 들어오고 나갔을 경우에는 딕셔너리에 아무런 정보가 없어 런타임 오류가 나게됩니다.