[Lv2] 오픈채팅방

이말감·2022년 4월 20일
0

Programmers

목록 보기
10/32

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

문제

링크

코드

def solution(record):
    answer = []
    check = []
    userId = {}
    name = []
    for r in range(len(record)):
        c = record[r].split(' ')[0]
        u = record[r].split(' ')[1]
        # 입장, 퇴장일 때
        if c != "Change" :
            # 입장일 때
            if c == "Enter" :
                n = record[r].split(' ')[2]
                # 앞에서 저장했던 사용자일 때
                if u in userId :
                    for i in range(len(userId[u])) :
                        # 채팅방을 나간 후, 새로운 닉네임으로 다시 들어왔을 수도 있으므로
                        name[userId[u][i]] = n
            # 퇴장일 때
            else :
                # userId에 저장된 사용자 아이디의 맨 처음 인덱스
                n = name[userId[u][0]]
        # 닉네임 변경일 때
        else :
            n = record[r].split(' ')[2]
            # 저장된 사용자가 아닐 경우
            if u not in userId :
                # 새롭게 추가
                userId[u] = [r]
            else :
                # 저장된 사용자일 경우 userId에 저장된 인덱스를 바탕으로 닉네임 바꿔주기
                for i in range(len(userId[u])) :
                    name[userId[u][i]] = n
        
        name.append(n)
        check.append(c)
        # userId에 저장된 사용자
        try :
            tmp = userId[u]
            tmp.append(r)
            userId[u] = tmp
        # userId에 저장되지 않은 사용자
        except :
            userId[u] = [r]
            
    for i in range(len(check)) :
        # 닉네임 변경은 출력 X
        if check[i] == "Change" :
            continue
        checkEnter = "들어왔습니다."
        if (check[i] == "Leave") :
            checkEnter = "나갔습니다."
        s = name[i] + "님이 " + checkEnter
        answer.append(s)
    return answer

처음에 코드를 작성하고 제출했을 때 두 개빼고 모든 테스트 케이스가 런타임 에러가 발생했다.
질문하기에 어떤 분이 감사하게도 본인이 고쳐서 해결한 에러에 관해 설명을 해주셔서 문제를 해결할 수 있었다.

# 퇴장일 때
            else :
                # userId에 저장된 사용자 아이디의 맨 처음 인덱스
                n = name[userId[u][0]]

코드 제출을 완료하고 주석을 작성하면서 의문이 든 부분이 있었다.
굳이 n을 새로 가져올 필요가 있나 생각해서 지워서 재제출했지만, 에러가 발생했고 다시 코드를 살펴 본 후 이해할 수 있었다.
퇴장일 때 입력은 "Leave uid1234" 이고, 사용자 아이디만 받아온다.
그러므로 사용자 닉네임이 필요한데, userId에 저장된 사용자 아이디를 바탕으로 닉네임을 불러올 수 있는 것이다.
여기서 만약 이미 채팅방에 있던 사람이라 입장 기록이 남지 않은 경우는 어떻게 해야하나 생각했다.
하지만 출력할 때 무조건 닉네임이 필요하므로, 기존에 있던 사람이 퇴장하기 전에 무조건 닉네임을 바꿀 것이라고 생각했다. 입장 기록이 없는 기존에 있던 사람의 닉네임을 받아오려면 그 방법 밖에 없기 때문이다. 그래서 위와 같이 코드를 작성했다.

profile
전 척척학사지만 말하는 감자에요

0개의 댓글