파이썬 알고리즘 240번 | 프로그래머스 오픈채팅방 (+) 테스트케이스 추가

Yunny.Log ·2022년 8월 16일
0

Algorithm

목록 보기
244/318
post-thumbnail

240. 오픈채팅방

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

1) 어떤 전략(알고리즘)으로 해결?

2) 코딩 설명

<내 풀이>


def solution(record):
    result = []
    answer = {}
    seq = []
    for r in record : 
        lis = list(r.split())
        if len(lis)==2 :
            enter, uid, nick = lis[0], lis[1], answer[uid][0] 
            # Leave 의 경우엔 nick 그대로 
        else : 
            enter, uid, nick = lis[0], lis[1], lis[2]
        seq.append(uid)

        # 0번째 인덱스에 닉네임, 이후 인덱스는 Enter or Leave
        if uid not in answer : # 초기화 
            answer[uid] = [nick, enter]
        else : 
            # (1) 채팅방을 나간 후, 새로운 닉네임으로 다시 들어가거나
            if (enter == "Enter" and nick!=answer[uid][0]) or enter=="Change": # 채팅방에서 닉네임을 변경
                answer[uid][0] = nick
            answer[uid].append(enter)
            
    for s in seq : 
        if answer[s][1] == "Leave" :
            enter_or_leave = "나갔습니다."
        elif answer[s][1] == "Enter" : 
            enter_or_leave = "들어왔습니다."
        else : 
            answer[s].pop(1)
            continue
        result.append("%s님이 %s" % (answer[s][0], enter_or_leave))
        answer[s].pop(1)

    return result

print(solution([
    "Enter uid1234 Muzi", 
    "Enter uid4567 Prodo",
    "Leave uid1234",
    "Enter uid1234 Prodo",
    "Change uid4567 Ryan", 
    "Leave uid4567", 
    "Enter uid1234 Cat",
    "Enter uid3579 Dog",
    "Change uid3569 CuteDog",
    "Leave uid1234",
    "Leave uid3579"
    ]))

< 내 틀렸던 풀이, 문제점>


def solution(record):
    result = []
    answer = {}
    seq = []
    for r in record : 
        lis = list(r.split())
        if len(lis)==2 :
            enter, uid, nick = lis[0], lis[1], answer[uid][0] 
            # Leave 의 경우엔 nick 그대로 
        else : 
            enter, uid, nick = lis[0], lis[1], lis[2]
        seq.append(uid)

        # 0번째 인덱스에 닉네임, 이후 인덱스는 Enter or Leave
        if uid not in answer : # 초기화 
            answer[uid] = [nick, enter]
        else : 
            # (1) 채팅방을 나간 후, 새로운 닉네임으로 다시 들어가거나
            if nick!=answer[uid][0] or enter=="Change": # 채팅방에서 닉네임을 변경
                answer[uid][0] = nick
            answer[uid].append(enter)
            
    for s in seq : 
        if answer[s][1] == "Leave" :
            enter_or_leave = "나갔습니다."
        elif answer[s][1] == "Enter" : 
            enter_or_leave = "들어왔습니다."
        else : 
            answer[s].pop(1)
            continue
        result.append("%s님이 %s" % (answer[s][0], enter_or_leave))
        answer[s].pop(1)

    return result

print(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan", "Leave uid4567", "Enter uid1234 Cat"]))

  • 오류 부분을 찾아보자~

nickname 갱신 부분 !

  • 닉네임이 갱신되는 경우는 두 가지 !
    1) enter 이 "Enter" 이면서 기존 닉네임과 이번 닉네임이 다를 때
    2) enter 이 "Change" 이면 무조건
    나는 이를
if nick!=answer[uid][0] or enter=="Change"

로 처리해두었었는데 이렇게 하고
아래 테스트케이스를 넣어보면

uid1234 의 이름이 Cat 으로 떠야하는데, uid3569 의 이름인 CuteDog로 뜨는 것임~
반례 결과값

['CuteDog님이 들어왔습니다.', # 얘 이름은 Cat으로 떠야하는데 
'Ryan님이 들어왔습니다.', 
'CuteDog님이 나갔습니다.', 'CuteDog님이 들어왔습니다
.', 'Ryan님이 나갔습니다.', 'CuteDog님이 들어왔습니다.', 'CuteDog님이 들어왔습니다.', 'CuteDog님이 나갔습니 
다.', 'CuteDog님이 나갔습니다.']

따라서 닉네임 변경과정에서의 로직을 확실히 해주고자

            # (1) 채팅방을 나간 후, 새로운 닉네임으로 다시 들어가거나
            if (enter == "Enter" and nick!=answer[uid][0]) or enter=="Change": # 채팅방에서 닉네임을 변경
            

로 두가지 경우를 처리해주었더니 정답처리가 되었다.

테스트케이스

(1)

[
    "Enter uid1234 Muzi", 
    "Enter uid4567 Prodo",
    "Leave uid1234",
    "Enter uid1234 Prodo",
    "Change uid4567 Ryan", 
    "Leave uid4567", 
    "Enter uid1234 Cat",
    "Enter uid3579 Dog",
    "Change uid3569 CuteDog",
    "Leave uid1234",
    "Leave uid3579"
    ]

정답

['Cat님이 들어왔습니다.', 
'Ryan님이 들어왔습니다.', 
'Cat님이 나갔습니다.', 
'Cat님이 들어왔습니다.', 
'Ryan님이 나갔습니다.', 
'Cat님이 들어왔습니다.', 
'Dog님이 들어왔습니다.', 
'Cat님이 나갔습니다.', 
'Dog님이 나갔습니다.']

<반성 점>

  • 문제를 처음에 대충 읽고 풀어서 Change 라는 명령어가 있는지도 몰랐지
  • 문제를 처음에 제대로 읽고 설계하는 것이 가장 효율적 + 빠르다

<배운 점>

  • 오랜만에 파이썬 문자열 안에 변수추가하는 것 배움
  • 사전 사용법 확실히 배움
  • 조건 처리해줄 때는 확실하게,

0개의 댓글